我想按名称不同的列合并数据集
例如,对于数据帧,df和df1
df <- data.frame(ID = c(1,2,3), Day = c(1,2,3), mean = c(2,3,4))
df1 <- data.frame(ID = c(1,2,3), Day = c(1,2,3), median = c(5,6,7))
我想合并df和df1以便我得到
ID Day Measure Value
1 1 Mean 2
2 2 Mean 3
3 3 Mean 4
1 1 Median 5
2 2 Median 6
3 3 Median 7
任何想法如何?我尝试使用
merge(df,df1, by=c("ID","Day")) and
rbind.fill(df,df1) from the plyr package
但他们每人只做我想要的一半。
答案 0 :(得分:4)
library(tidyr)
m <- merge(df, df1, c("ID", "Day"))
gather(m, measure, value, mean:median)
# ID Day measure value
#1 1 1 mean 2
#2 2 2 mean 3
#3 3 3 mean 4
#4 1 1 median 5
#5 2 2 median 6
#6 3 3 median 7
使用reshape2
:
melt(m, id=c("ID", "Day"))
或data.table
:
setDT(df, df1)
setkey(df, ID, Day)
melt(df[df1], c("ID", "Day"))
# 1: 1 1 mean 2
# 2: 2 2 mean 3
# 3: 3 3 mean 4
# 4: 1 1 median 5
# 5: 2 2 median 6
# 6: 3 3 median 7
答案 1 :(得分:1)
在基地R:
vars <- c("ID","Day")
m <- merge(df, df1, by=vars)
cbind(m[vars], stack(m[setdiff(names(m),vars)]) )
# ID Day values ind
#1 1 1 2 mean
#2 2 2 3 mean
#3 3 3 4 mean
#4 1 1 5 median
#5 2 2 6 median
#6 3 3 7 median
答案 2 :(得分:-1)
您可以在两个名为“Measure”的原始data.frames中添加一个新列,然后将整个列设置为第一个data.frame中的“Mean”和第二个data.frame中的“Median”。然后将两个data.frames中的均值和中位数的colname设置为“Value”。然后使用rbind进行组合。