列出R中data.table的每一行的NA值列

时间:2014-04-17 01:19:09

标签: r data.table

我想在data.table对象中添加一列,列出该行的NA列名。例如,假设我有以下data.table:

dt <- data.table(a = c(1, 2, 3, NA), 
                 b = c(1, 2, NA, NA), 
                 c = c(NA, 2, NA, 4))
    a  b  c        
1:  1  1 NA        
2:  2  2  2        
3:  3 NA NA        
4: NA NA  4

我想添加一个包含这些值的列,产生以下data.table:

dt[, na.cols := c("c", "", "b,c", "a,b")]
    a  b  c na.cols        
1:  1  1 NA       c
2:  2  2  2        
3:  3 NA NA     b,c
4: NA NA  4     a,b

如何动态添加此列?

2 个答案:

答案 0 :(得分:5)

这是一种避免在apply上使用data.table(在内部强制执行矩阵)的方法

dt[, na.cols := gsub('(^,+)|(,+$)','',do.call(paste, c(lapply(seq_along(.SD), function(x) ifelse(is.na(.SD[[x]]),names(.SD)[x],'')), sep=',')))]
#     a  b  c na.cols
# 1:  1  1 NA       c
# 2:  2  2  2        
# 3:  3 NA NA     b,c
# 4: NA NA  4     a,b

答案 1 :(得分:1)

你可以这样做:

dt[, na.cols := 
   apply(dt, 1, function(row) paste(names(row)[which(is.na(row))],
                                    collapse=","))]  

详细信息:基本上,您使用margin 1申请(即沿着行),然后,对于每一行,将NA列名称粘贴在一起。