查找R中行值大于零的列索引

时间:2018-06-25 10:20:10

标签: r dataframe

我的数据设置如下:

    A   B   C
R1  1   0   1
R2  0   1   0
R3  0   0   0

我想在数据集中添加另一个名为index的列,以便为列值大于零的每一行提供列名。我想要的结果如下:

    A   B   C   Index
R1  1   0   1   A,C
R2  0   1   0   B
R3  0   0   0   NA

2 个答案:

答案 0 :(得分:1)

这是使用base的一种方法:

使用apply遍历行,查找等于1的元素并将相应的列名称粘贴在一起:

df$Index <- apply(df, 1, function(x) paste(colnames(df)[which(x == 1)], collapse = ", "))

df$Index <-创建一个名为Index的新列,该列将保存操作的结果

apply-在矩阵/数据框的行和/或列上应用函数

1-指定该功能应应用于行(2-表示在列上方)

function(x)一个未定义的函数,该函数进一步定义-x对应于每一行

which(x == 1)某行的元素等于1的输出是TRUE/FALSE

colnames(df)-数据框的列名

colnames(df)[which(x == 1]-子集TRUE的列名称which(x == 1)

pastecollapse = ", "-将一个字符向量(在这种情况下,我们之前获取的列名称向量)折叠成一个字符串,其中每个元素将由,分隔。 / p>

现在用NA替换空条目

df$Index[df$Index == ""] <- NA_character_

这是输出的样子

#output
  sample A B C Index
1     R1 1 0 1  A, C
2     R2 0 1 0     B
3     R3 0 0 0  <NA>

数据:

structure(list(sample = structure(1:3, .Label = c("R1", "R2", 
"R3"), class = "factor"), A = c(1L, 0L, 0L), B = c(0L, 1L, 0L
), C = c(1L, 0L, 0L)), .Names = c("sample", "A", "B", "C"), class = "data.frame", row.names = c(NA, 
-3L))

答案 1 :(得分:0)

风味不同的apply()解决方案:

df$index <- apply(df, 1, function(x) ifelse(any(x), toString(names(df)[x == 1]), NA))

   A B C index
R1 1 0 1  A, C
R2 0 1 0     B
R3 0 0 0  <NA>

数据:

df <- structure(
  list(
    A = c(1L, 0L, 0L), 
    B = c(0L, 1L, 0L),
    C = c(1L, 0L, 0L)
  ), 
  row.names = paste0('R', 1:3), 
  class = "data.frame"
)