按具有不同名称的列合并数据集

时间:2015-07-23 22:48:47

标签: r merge

我想按名称不同的列合并数据集

例如,对于数据帧,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

但他们每人只做我想要的一半。

3 个答案:

答案 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进行组合。