我有一个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
答案 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)])