我的数据设置如下:
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
答案 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)
paste
与collapse = ", "
-将一个字符向量(在这种情况下,我们之前获取的列名称向量)折叠成一个字符串,其中每个元素将由,
分隔。 / 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"
)