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

时间:2019-09-19 15:32:03

标签: 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

3 个答案:

答案 0 :(得分:1)

You should try gather() from the tidyr package.

Gather将创建一列具有var-name的列和一列具有值的列。然后,您可以仅过滤到值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)

答案 1 :(得分:1)

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

例如

df$var1 = ifelse(df$var1 == 1, "var1", 0)

如果要遍历多列,可以通过使用lapply和列名列表来使其更具可复制性,然后在ifelse语句中使用“ var1”代替names(df[x])

答案 2 :(得分:1)

针对任意数据帧和目标值的Base R解决方案:

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)])