将变量折叠为一个变量,其值保留变量名称

时间:2016-08-05 22:33:58

标签: r reshape

合并两个数据框后,我明白了:

d.f <- data.frame(sex = c("M", "F", NA, NA),
       age = c(NA, NA, "old", "young"),
       n = c(2, 1, 3, 4))

...但是想将前两个变量合并为一个,最后得到这个:

sex.age      n
 sex.M       2
 sex.F       1
 age.old     3
 age.young   4

这似乎是一个简单(可能很常见)的问题,但我真的很难找到答案。我认为有一些东西是按照tidyr和reshape的方式做好的,但我找不到它 - 可能是因为最终的结构非常不整洁。

数据结构将保持不变,这意味着NA始终位于不同的行中。像

这样的解决方案
na.omit(unlist(d.f[1:2]))

apply(d.f[, 1:2], 1, function(x) x[!is.na(x)])

工作,但没有简单的方法来获取变量名前缀。

2 个答案:

答案 0 :(得分:1)

您可以使用reshape2包中的melt

library(reshape2)
df <- melt(d.f, id.vars = "n")
df[!is.na(df$value), ]
#   n variable value
# 1 2      sex     M
# 2 1      sex     F
# 7 3      age   old
# 8 4      age young

答案 1 :(得分:0)

以下是使用dplyr/tidyr的选项。我们隐瞒了广泛的&#39;长期&#39;格式为gatherunite列&#39; Var&#39;和&#39; Val&#39;创造性别观念&#39;并重新排列列顺序。

library(dplyr)
library(tidyr)
gather(d.f, Var, Val, -n, na.rm = TRUE) %>% 
                 unite(sex.age, Var, Val, sep=".") %>%
                 select(2:1)
#    sex.age n
#1     sex.M 2
#2     sex.F 1
#7   age.old 3
#8 age.young 4