簡體   English   中英

R data.table選擇基於組的最大值列

[英]R data.table select set of columns for maximum value based on group

我看到多個帖子符合我的要求,但有些帖子無法獲得所需的結果。

我有一個包含多列的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]

請告訴我出錯的地方以及如何實現這一目標。

如果我們需要獲得max ,在按“區域”分組並在.SDcols指定“mycol” .SDcols ,循環遍歷Data.table( .SD )的子集並獲得max

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

如果存在僅具有NA值的“區域”,則在返回Infmax將返回警告。 例如,

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'作為paste d字符串

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM