使用由另一列分组的两个参数的函数改变每一列
Mutate each column with function with two parameter grouped by another column
以下数据集代表了我的情况:
library(dplyr)
df <- data_frame(
G1 = rep(1:2, each = 10),
G2 = rep(1:10, 2),
C1 = rnorm(20),
C2 = rnorm(20),
C3 = rnorm(20),
C4 = rnorm(20)
)
我要执行以下操作,
df %>%
group_by(G1, G2) %>%
mutate(
C1 = C1 - C2,
C2 = C2 - C2,
C3 = C3 - C2,
C4 = C4 - C2
)
如果只有4列(C1、C2、C3和C4),我可以应用上面的解决方案。但是,我有很多列,对于每一列,我都需要执行相同的操作。有什么简洁明了的解决方案可以把这个问题扩展到很多列吗?
如果您能在希望改变的列名中找到一些共性,您可以利用 dplyr::mutate_at()
:
df %>%
group_by(G1, G2) %>%
mutate_at(vars(starts_with("C")), funs(. - C2))
编辑
因为 mutate()
按顺序操作和存储每列的结果,您有两种选择来解决这个问题。您可以使用 reorder(df, everything(), C2)
,这样您的 C2
就是您的 data.frame
中的最后一行,或者像这样添加第二行:
set.seed(1)
library(dplyr)
df <- data_frame(
G1 = rep(1:2, each = 10),
G2 = rep(1:10, 2),
C1 = rnorm(20, 0),
C2 = rnorm(20, 1),
C3 = rnorm(20, 10),
C4 = rnorm(20, 100)
)
df %>%
mutate_at(vars(starts_with("C"), -C2), funs(. - C2)) %>%
mutate_at(vars(C2), funs(. - C2))
这只是对除第一行 C2
之外的每一列进行变异。然后第二行返回并在其他列被愉快地减去之后变异 C2
。
如何使用 data.table
指定您想要的列 .SDcols
?
library(data.table)
cols <- colnames(df)[which(grepl("C",colnames(df)))]
dt <- setDT(df)[, lapply(.SD, function(x) x - C2), by=.(G1,G2), .SDcols = cols]
以下数据集代表了我的情况:
library(dplyr)
df <- data_frame(
G1 = rep(1:2, each = 10),
G2 = rep(1:10, 2),
C1 = rnorm(20),
C2 = rnorm(20),
C3 = rnorm(20),
C4 = rnorm(20)
)
我要执行以下操作,
df %>%
group_by(G1, G2) %>%
mutate(
C1 = C1 - C2,
C2 = C2 - C2,
C3 = C3 - C2,
C4 = C4 - C2
)
如果只有4列(C1、C2、C3和C4),我可以应用上面的解决方案。但是,我有很多列,对于每一列,我都需要执行相同的操作。有什么简洁明了的解决方案可以把这个问题扩展到很多列吗?
如果您能在希望改变的列名中找到一些共性,您可以利用 dplyr::mutate_at()
:
df %>%
group_by(G1, G2) %>%
mutate_at(vars(starts_with("C")), funs(. - C2))
编辑
因为 mutate()
按顺序操作和存储每列的结果,您有两种选择来解决这个问题。您可以使用 reorder(df, everything(), C2)
,这样您的 C2
就是您的 data.frame
中的最后一行,或者像这样添加第二行:
set.seed(1)
library(dplyr)
df <- data_frame(
G1 = rep(1:2, each = 10),
G2 = rep(1:10, 2),
C1 = rnorm(20, 0),
C2 = rnorm(20, 1),
C3 = rnorm(20, 10),
C4 = rnorm(20, 100)
)
df %>%
mutate_at(vars(starts_with("C"), -C2), funs(. - C2)) %>%
mutate_at(vars(C2), funs(. - C2))
这只是对除第一行 C2
之外的每一列进行变异。然后第二行返回并在其他列被愉快地减去之后变异 C2
。
如何使用 data.table
指定您想要的列 .SDcols
?
library(data.table)
cols <- colnames(df)[which(grepl("C",colnames(df)))]
dt <- setDT(df)[, lapply(.SD, function(x) x - C2), by=.(G1,G2), .SDcols = cols]