我看到了多个帖子来满足我的要求,但有些帖子无法获得所需的结果。
我有一个包含多列的 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))
Run Code Online (Sandbox Code Playgroud)
现在对于上述数据,我想按区域选择 4 列作为最大值。所以结果应该有 ID 变量、区域变量和这 4 个变量,共 10 行。每个区域 1 行。我尝试了下面的代码,但它创建了一个列作为 mycol 并将向量 mycol 的第 4 个元素的值
mycol <- paste("Q24","LOC",seq(1:4),"PAN",sep = "_")
df2 <- df1[,.(mycol = max(mycol)),by=region]
Run Code Online (Sandbox Code Playgroud)
请建议我哪里出错了以及如何实现这一点。
如果我们需要获取max,在按'region'分组并在 中指定'mycol'后.SDcols,循环遍历Data.table( .SD)的子集并获取max
df1[, lapply(.SD, max), by = region, .SDcols = mycol]
Run Code Online (Sandbox Code Playgroud)
如果存在只有 NA 值的“区域”,max则将在返回时返回警告Inf。例如,
max(c(NA, NA), na.rm = TRUE)
#[1] -Inf
Run Code Online (Sandbox Code Playgroud)
警告消息:在 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]
Run Code Online (Sandbox Code Playgroud)
如果我们还需要 'ID' 作为pasted 字符串
df1[, c(list(ID = toString(ID)), lapply(.SD, max)), by = region, .SDcols = mycol]
Run Code Online (Sandbox Code Playgroud)