【问题标题】:How to create a new column based on other columns in a data.table?如何根据 data.table 中的其他列创建新列?
【发布时间】: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


【解决方案1】:

这是一种选择:

DT[, new := ifelse(rowSums(.SD == "Yes", na.rm = T) > 0,
                   'Yes',
                   ifelse(rowSums(is.na(.SD)) != ncol(.SD), "No", NA))
   , .SDcols = x:v]
#    x   y  v l new
#1: NA  No No 1  No
#2: NA Yes No 1 Yes
#3: NA  NA NA 1  NA

【讨论】:

    【解决方案2】:

    pmax 非常适合这个问题。

    第一个例子在 0/1 的情况下...

    DT0[, do.call(pmax, c(na.rm=TRUE, .SD)), .SDcols=x:v]
    # 0 1 NA
    

    第二个例子如果你已经将 0/1 编码为 my_lvls = c("No","Yes")...

    DT[, 
      factor(
        labels = my_lvls,
        x      = do.call(pmax, c(na.rm=TRUE, lapply(.SD, function(x) 
                   as.integer(factor(x, levels=my_lvls)))))
      )
    , .SDcols=x:v]
    # [1] No   Yes  <NA>
    # Levels: No Yes
    

    如@eddi 的回答所示,要添加新的col,您可以将x:v 放入.SDcols 并使用.SD。

    【讨论】:

    • 我很少有借口连续写五个)s...一定有更好的方法,虽然我不喜欢强制使用row/colSums。跨度>
    猜你喜欢
    • 1970-01-01
    • 2021-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多