[英]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
的列名
paste
有collapse = ", "
-折叠字符向量(在这种情况下,我们之前获得的列名的载体中)进入其中每个元素将被分开的字符串,
。
现在用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.