从其他列中按名称获取列的值,并使用na

时间:2019-05-08 09:54:54

标签: r data.table

之前,我的问题是如何从包含na?的其他列中按名称获取列值,但是现在此表是动态的,如果有更多列(最多6列),则应该是具有value的列和在北美休息。

也就是说,如果有2个名称和值分别为var1和value_v1,var2和value_v2,则应该有var3和value3 = NA,直到获得var6和value6

这是一个简单的例子。

 THis table is dinyamic, there may be more columns or not.  

 > d
     value1   value2      var1 
1:     one     two     value1
2:     uno     dos     value2
3:       1       2     value1
4:      NA      NA      NA
5:       6       7     value2 

我有一个解决方案,可以添加一列(column的值= value_v1,value_v2 ...等),其中包含由'((column的名称= var1,var2 ..)指定的列的值。

对于这种情况,我有解决方案:

d [,value_v1:= get(replace(var1,is.na(var1),“ value1”)),1:nrow(d)] d [,value_v2:= get(replace(var2,is.na(var2),“ value2”)),1:nrow(d)]

> d

但是我需要考虑是否存在更多的列名和列值(最多6个)。 如果有另一个columana,则可能是结果,其想法是进入var6

> d
   value1    value2         var1    value_v1   var2    value_v2
1:     one     two         value1    one        na       na
2:     uno     dos         value2    dos        na       na
3:       1       2         value1    1          na       na 
4:      NA       NA          NA      NA         na       na
5:      6        7         value2    7          na       na

1 个答案:

答案 0 :(得分:2)

一个选项是get

d[, value.of.col := get(replace(name.of.col, is.na(name.of.col), 
                "value.1")), 1:nrow(d)]
d
#   value.1 value.2 name.of.col value.of.col
#1:     one     two     value.1          one
#2:     uno     dos     value.2          dos
#3:       1       2     value.1            1
#4:    <NA>    <NA>        <NA>         <NA>
#5:       6       7     value.2            7

或使用row/col中的base R索引

i1 <- !is.na(d$name.of.col)
m1 <- cbind(seq_len(nrow(d[i1,])), match(d$name.of.col[i1], names(d)))
d$value.of.col[i1] <- as.data.frame(d)[i1, 1:2][m1]