繁体   English   中英

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

[英]Find column index where row value is greater than zero in R

我的数据集如下:

    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

这是一种使用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] -子集对表达式which(x == 1)TRUE的列名

pastecollapse = ", " -折叠字符向量(在这种情况下,我们之前获得的列名的载体中)进入其中每个元素将被分开的字符串,

现在用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))

略有不同的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"
)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM