R中的特殊合并

时间:2017-07-22 02:08:57

标签: r dataframe

我有一个包含大量行和列的数据框,但是对于这个特定的练习,我只需要两列用于该数据框。例如,我有这个:

    ID Amount
  1  7    100
  2  6    495
  3 85    550
  4 64    600
  5  3    150

我还有另一个数据框,它也有很多行和列,但我只需要三列:

  ID Perc Type
1  7 0.05    A
2  6 0.50    A
3 85 0.75    A
4  7 0.90    B
5 64 0.30    C
6  3 0.50    A
7 64 0.40    A

我需要做的是按ID合并两个数据框,但是有一个额外的列告诉我每个数据框的百分比,如果没有找到则放零,如下所示:

  ID Amount    A   B   C
1  7    100 0.05 0.9 0.0
2  6    495 0.50 0.0 0.0
3 85    550 0.75 0.0 0.0
4 64    600 0.40 0.0 0.3
5  3    150 0.50 0.0 0.0

也许这不是完全合并,但这只是我想到的。

有什么想法吗?

谢谢!

2 个答案:

答案 0 :(得分:2)

您必须将第二个数据帧从long转换为宽(请参阅package reshape2以便于使用),然后将其结果合并到第一个数据框中。

执行以下操作:

library(reshape2)

# Transform from long to wide
df2_wide = dcast(df2, ID ~ Type, value.var = "Perc")

# Set NAs to 0
df2_wide[is.na(df2_wide)] = 0

# Merge both data frames
df3 = merge(df1,df2_wide)

df2是您的第二个数据框,df1是第一个数据框。

结果:

  ID Amount    A   B   C
1  3    150 0.50 0.0 0.0
2  6    495 0.50 0.0 0.0
3  7    100 0.05 0.9 0.0
4 64    600 0.40 0.0 0.3
5 85    550 0.75 0.0 0.0

答案 1 :(得分:1)

以下是使用tidyrdplyr软件包

的解决方案
df1<-structure(list(ID = c(7L, 6L, 85L, 64L, 3L), Amount = c(100L,  495L, 550L, 600L, 150L)), 
          .Names = c("ID", "Amount"), class = "data.frame", row.names = c("1", "2", "3", "4", "5"))

df2<-structure(list(ID = c(7L, 6L, 85L, 7L, 64L, 3L, 64L),  Perc = c(0.05,  0.5, 0.75, 0.9, 0.3, 0.5, 0.4), 
             Type = structure(c(1L, 1L, 1L,  2L, 3L, 1L, 1L), 
             .Label = c("A", "B", "C"), class = "factor")), 
             .Names = c("ID", "Perc", "Type"), class = "data.frame", row.names = c("1", "2",  "3", "4", "5", "6", "7"))

library(tidyr)
#go from long to wide format
df2w<-spread(df2, Type, Perc, fill=0)

library(dplyr)
#merge the 2 data frames together
final answer<-left_join(df2w, df1, by="ID")