使用列名重命名行值,然后使用R将其聚合为一列

使用列名重命名行值,然后使用R将其聚合为一列,r,R,我有一个data.frame,行值为0和1。现在我需要用列名替换1。稍后,我需要将它们聚合到一列(因为一行中没有重复) 数据框看起来像这个 var1 var2 var3 0 1 0 1 0 0 0 0 1 预期产量 var1 var2 var3 var 0 var2 0 var2 var1 0 0 var1 0 0 var3 var3 G

我有一个data.frame,行值为0和1。现在我需要用列名替换1。稍后,我需要将它们聚合到一列(因为一行中没有重复)

数据框看起来像这个

var1   var2    var3 
0      1       0
1      0       0
0      0       1
预期产量

var1   var2    var3 var
0      var2    0    var2
var1   0       0    var1
0      0       var3 var3

Gather将创建一个包含var名称的列和一个包含值的列。之后,您可以只过滤到值1,然后删除值列

library(dplyr) # for piping
library(tidyr) # for gather

df %>%
gather(var,value) %>% # the arguments simply name the output columns
filter(value == 1) %>%
select(-value)

您可以结合使用
ifelse
语句将1替换为列名

e、 g

df$var1=ifelse(df$var1==1,“var1”,0)


如果您想在多个列上进行迭代,您可以使用
lappy
和列名列表,然后在
ifelse
语句中使用
names(df[x])
基R解决方案,而不是使用“var1”来复制任意数据帧和目标值:

df <- data.frame(
var1  = c(0,1,0),
var2 = c(1,0,0),
var3 = c(0,0,1))

# Task 1 
val <- 1 # value to subsitute
for (n in names(df)){
  df[[n]][df[[n]] == val] <- n
}

# Task 2
df$var <- apply(df, 2, function(x) x[grepl("var", x)])

df作为一个新手程序员,这很容易理解。
gather
在为
NA
时没有保留行值。而且它没有保持行的完整性。我无法掌握任务2中的函数(x)。我应该在哪里了解它?感谢您的解决方案。
apply
with
MARGIN=2
按行应用我定义的函数。函数返回括号内条件为true的行的元素
grepl
将搜索模式(“var”)并返回TRUE/FALSE。在R控制台中键入
?apply
?grepl
以了解更多信息。感谢您提供的解释。现在我意识到R中for循环的威力。您提供了一个极好的解决方案。我已经改变了公认的答案。谢谢你的回答@slava