r - if else 命令在 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)]
解决方案
试试B=ifelse("B"%in%names(dt),mean(B),NA)
它会给你一个带有 NA 的列,但它可以扩展到任意标准和列名。
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)]
在运行此程序时,我得到 100 行响应,因为其中包含原始 C 而不是新 C,因此它为您D=sum(A)/C
提供C
100 行,因为有 100 C
s。如果您更改对D
to的定义,sum(A)/mean(C)
那么它会给出您可能想要的内容。
编辑:
J
另一种方法是利用在表达式中使用花括号的能力
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)]
在这里,我设置了一个名为的辅助变量checkcol
,这样我们就不会放在"B"
两个地方。接下来,我们使用您知道您想要的列来制作您的初步结果。之后,我们检查是否存在任何内容,checkcol
如果存在,我们将该列添加到我们现有的列表中。然后花括号中的最后一行data.table
显示的是我们的prelimresult
列表,它可能有也可能没有“B”列。你也可以相当广泛地扩展这种方法。
推荐阅读
- python - Pygame time.clock() 奇怪的行为
- android - 使用 ORB 比较 android OpenCV 中的两个图像
- python - 以“a”模式打开文件时如何删除空白行?
- android - java.lang.RuntimeException: java.lang.RuntimeException: com.android.builder.dexing.DexArchiveMergerException:
- tensorflow - 张量流如何在段总和后获得与输入张量相同大小的输出
- testing - 是否可以使用无服务器框架将测试事件推送到 AWS Lambda?
- c++ - 指向成员类型的指针与对象类型不兼容 → 原因是什么?
- asp.net - '{ selector: string; 类型的参数 模板:字符串;指令:
- ios - 将最大行数设置为 NSMutableAttributedString
- javascript - 无法使用 Object.assign 获取文档 keydown 事件