R data.table根据组

时间:2018-04-20 05:50:13

标签: r data.table max

我看到多个帖子符合我的要求,但有些帖子无法获得所需的结果。

我有一个包含多列的data.table。在所有列中,我想为最大值选择几列,并按组变量汇总它们。

以下是我的样本数据 -

library("data.table")
set.seed(1200)

ID <- seq(1001,1100)
region <- sample(1:10,100,replace = T)
Q21 <- sample(1:5,100,replace = T)
Q22 <- sample(1:15,100,replace = T)
Q24_LOC_1 <- sample(1:8,100,replace = T)
Q24_LOC_2 <- sample(1:8,100,replace = T)
Q24_LOC_3 <- sample(1:8,100,replace = T)
Q24_LOC_4 <- sample(1:8,100,replace = T)

Q21_PAN <- sample(1:5,100,replace = T)
Q22_PAN <- sample(1:15,100,replace = T)
Q24_LOC_1_PAN <- sample(1:8,100,replace = T)
Q24_LOC_2_PAN <- sample(1:8,100,replace = T)
Q24_LOC_3_PAN <- sample(1:8,100,replace = T)
Q24_LOC_4_PAN <- sample(1:8,100,replace = T)

df1 <- as.data.table(data.frame(ID,region,Q21,Q22,Q24_LOC_1,Q24_LOC_2,Q24_LOC_3,Q24_LOC_4,Q21_PAN,Q22_PAN,Q24_LOC_1_PAN,Q24_LOC_2_PAN,Q24_LOC_3_PAN,Q24_LOC_4_PAN))

现在,对于上述数据,我想按区域选择4列作为最大值。所以结果应该有ID变量,区域变量和这4个变量有10行。每个区域有1行。我尝试了下面的代码,但是它创建了一个列作为mycol,并将vector mycol的第4个元素的值放入

mycol <- paste("Q24","LOC",seq(1:4),"PAN",sep = "_")

df2 <- df1[,.(mycol = max(mycol)),by=region]

请建议我哪里出错,以及如何实现这一目标。

1 个答案:

答案 0 :(得分:3)

如果我们需要获取max,则按照&#39;区域&#39;进行分组后并指定&#39; mycol&#39;在.SDcols中,循环遍历Data.table的子集(.SD)并获取max

df1[, lapply(.SD, max), by = region, .SDcols = mycol]

如果有&#39; region&#39;只有NA值的max会返回Inf并返回警告。例如,

max(c(NA, NA), na.rm = TRUE)
#[1] -Inf
  

警告信息:在max(c(NA,NA),na.rm = TRUE):没有非遗漏   参数max;返回-Inf

要更正此问题,我们可以添加if/else条件

df1[, lapply(.SD, function(x) if(all(is.na(x))) NA_integer_
       else max(x, na.rm = TRUE)), by = region, .SDcols = mycol]

如果我们还需要ID&#39;作为paste d字符串

df1[, c(list(ID = toString(ID)), lapply(.SD, max)), by = region, .SDcols = mycol]