合并两个数据框后,我明白了:
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)])
工作,但没有简单的方法来获取变量名前缀。
答案 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;格式为gather
,unite
列&#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