R 在data.table中使用if else命令添加列

R 在data.table中使用if else命令添加列,r,data.table,R,Data.table,假设我有一个data.table,其中有列“a”、“C”、“byvar”,有时还有列“B”。我想用一个变量“byvar”来概括它,但仅当它存在或有其他条件时才包括B 以下这些似乎不起作用,有人有想法吗 dt[, .( A=sum(A), if("B" %in% names(dt)) {B=mean(B)}, C=mean(C), D=sum(A)/C ), by = .(byvar)] 你可以试试 dt[, lapply(.SD, sum), b

假设我有一个data.table,其中有列“a”、“C”、“byvar”,有时还有列“B”。我想用一个变量“byvar”来概括它,但仅当它存在或有其他条件时才包括B

以下这些似乎不起作用,有人有想法吗

dt[, .(
A=sum(A),
if("B" %in% names(dt)) {B=mean(B)},
C=mean(C),
D=sum(A)/C
), by = .(byvar)]
             
你可以试试

dt[, lapply(.SD, sum), byvar,,.SDcols = patterns("A|B|C")]
尝试
B=ifelse(“B”%in%names(dt),mean(B),NA)
它将为您提供一个带有NAs的列,但它可以扩展到任意条件和列名

dt<-data.table(A=runif(100,1,100), C=runif(100,1,100), byvar=rep(letters[1:10],10))
dt[, .(
  A=sum(A),
  B=ifelse("B"%in%names(dt),mean(B),NA),
  C=mean(C),
  D=sum(A)/C
), by = .(byvar)]

这里我设置了一个名为
checkcol
的助手变量,这样我们就不会把
的“B”
放在两个地方。接下来,我们使用您知道需要的列生成您的初步结果。然后,我们检查
checkcol
中的内容是否存在,如果存在,我们将该列添加到我们先前存在的列表中。大括号中的最后一行是
数据。表
显示的是我们的
prelimresult
列表,该列表可能有也可能没有“B”列。您也可以将此方法扩展得相当广泛。

谢谢,但实际情况并非如此普遍,是否可以使用某种if语句?我修改了示例以使其更清晰,谢谢@tafelplankje查看我的更新,其中
patterns
可以帮助您找到要汇总的列。如果您创建一个可复制的小示例以及预期的输出,则会更容易提供帮助。了解。
dt[, {checkcol='B'
  prelimreturn=list(A=sum(A),
                    C=mean(C),
                    D=sum(A)/mean(C))
  if(checkcol%in%names(dt)) prelimreturn[[checkcol]]<-mean(get(checkcol))
  prelimreturn}
, by = .(byvar)]