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

列出R中data.table的每一行具有NA值的列,r,data.table,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

我想在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
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

如何动态添加此列?

您可以这样做:

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

详细信息:基本上,您使用沿
margin 1
(即沿行)应用,然后,对于每一行,将
NA

的列名粘贴在一起。这里有一种方法可以避免在
数据表上使用
apply
(强制在内部使用矩阵)


实际上,这比
apply
解决方案快50%。谢谢
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