【发布时间】:2015-11-17 23:11:21
【问题描述】:
DT0 = data.table(x=rep(c(NA,NA,NA)), y=c(0,1,NA), v=c(0, 0, NA), l=c(1,1,1))
DT0
# x y v l
#1: NA 0 0 1
#2: NA 1 0 1
#3: NA NA NA 1
基于前三个列 x、y 和 v 我想添加一个具有以下输出的新列
#1: No
#2: Yes
#3: NA
NA 如果所有行都是NA。 Yes 如果其中任何一个是 1 否则 0。我目前的做法是
relevant_cols <- c('x', 'y', 'v')
new <- data.table(apply(DT0[, relevant_cols, with=F], 1, function(val) { ifelse(all(is.na(val)), NA_character_, ifelse(any(val == TRUE, na.rm = TRUE), 'Yes', 'No')) }))
DT0[, new:= new]
DT0
# x y v l new
#1: NA 0 0 1 No
#2: NA 1 0 1 Yes
#3: NA NA NA 1 NA
但是,由于实际的data.table 很大,有没有更好的方法来做到这一点?
编辑:
通常 data.table 条目是非数字的,因此如果我能有一个比使用 pmax e.g. 更通用的解决方案,这将非常有帮助,
DT = data.table(x=rep(c(NA,NA,NA)), y=c('No','Yes',NA), v=c('No', 'No', NA), l=c(1,1,1))
DT
# x y v l
#1: NA No No 1
#2: NA Yes No 1
#3: NA NA NA 1
【问题讨论】:
-
喜欢
do.call(pmax, c(DT[,x:v,with=FALSE], na.rm=TRUE)),但重新贴标签?或者你有一些非 0/1 条目? -
谢谢@Frank。如果条目是非数字的(已编辑的 data.table),是否有类似的解决方案。
-
我们可以和
rowSums一起玩,就像DT[, rowSums(.SD == "Yes", na.rm = TRUE) *NA^(rowSums(is.na(.SD)) == .N), .SDcols = -"l"]一样
标签: r data.table