【问题标题】:R merge without duplicating columnsR合并而不重复列
【发布时间】:2014-08-18 22:02:46
【问题描述】:

我有两个数据框。例如

require('xlsx')
csvData <- read.csv("myData.csv")
xlsData <- read.xlsx("myData.xlsx")

csvData 如下所示:

Period  CPI     VIX
1       0.029   31.740
2       0.039   32.840
3       0.028   34.720
4       0.011   43.740
5       -0.003  35.310
6       0.013   26.090
7       0.032   28.420
8       0.022   45.080

xlsData 看起来像这样:

Period  CPI     DJIA
1       0.029   12176
2       0.039   10646
3       0.028   11407
4       0.011   9563
5       -0.003  10708
6       0.013   10776
7       0.032   9384
8       0.022   7774

当我合并这些数据时,CPI数据重复,并且在标题上放了一个后缀,这是有问题的(我的真实df中有更多列)。

mergedData <- merge(xlsData, csvData, by = "Period")

合并数据:

Period  CPI.x   VIX     CPI.y   DJIA
1       0.029   31.740  0.029   12176
2       0.039   32.840  0.039   10646
3       0.028   34.720  0.028   11407
4       0.011   43.740  0.011   9563
5       -0.003  35.310  -0.003  10708
6       0.013   26.090  0.013   10776
7       0.032   28.420  0.032   9384
8       0.022   45.080  0.022   7774

我想合并数据框而不复制具有相同名称的列。例如,我想要这种输出:

Period  CPI     VIX     DJIA
1       0.029   31.740  12176
2       0.039   32.840  10646
3       0.028   34.720  11407
4       0.011   43.740  9563
5       -0.003  35.310  10708
6       0.013   26.090  10776
7       0.032   28.420  9384
8       0.022   45.080  7774

我不想使用额外的“by”参数,或者从一个 df 中删除列,因为在两个 df 中重复的列太多。我只是在寻找一种在合并过程中删除那些重复列的动态方法。

谢谢!

【问题讨论】:

    标签: r merge dataframe


    【解决方案1】:

    如果公共列的名称相同,您可以跳过 by 参数。

    来自?merge

    默认情况下,数据框会合并到名称相同的列上,但可以通过 by.xby.y 给出单独的列规范。

    记住这一点,以下应该有效(就像它在您的示例数据上所做的那样):

    merge(csvData, xlsData)
    #   Period    CPI   VIX  DJIA
    # 1      1  0.029 31.74 12176
    # 2      2  0.039 32.84 10646
    # 3      3  0.028 34.72 11407
    # 4      4  0.011 43.74  9563
    # 5      5 -0.003 35.31 10708
    # 6      6  0.013 26.09 10776
    # 7      7  0.032 28.42  9384
    # 8      8  0.022 45.08  7774
    

    【讨论】:

    • 谢谢。我没有意识到“by”是可选的。如果我的df的长度不同怎么办?例如,假设 csvData 只有 7 行。我想保留 xlsData 中的所有数据。然后 cbind csvData(对应于 csvData 的第 8 行可以为 NULL)。
    • @Clark,也许使用all = TRUE?示例:merge(csvdata[1:7, ], xlsdata, all = TRUE)
    【解决方案2】:

    您还可以按名称索引您感兴趣的特定列。如果您只需要大型数据框中的单个列/向量,这将非常有用。

    Period <- seq(1,8)
    CPI <- seq(11,18)
    VIX <- seq(21,28)
    DJIA <- seq(31,38)
    Other1 <- paste(letters)[1:8]
    Other2 <- paste(letters)[2:9]
    Other3 <- paste(letters)[3:10]
    
    df1<- data.frame(Period,CPI,VIX)
    df2<- data.frame(Period,CPI,Other1,DJIA,Other2,Other3)
    
    merge(df1,df2[c("Period","DJIA")],by="Period") 
    
    > merge(df1,df2[c("Period","DJIA")],by="Period")
      Period CPI VIX DJIA
    1      1  11  21   31
    2      2  12  22   32
    3      3  13  23   33
    4      4  14  24   34
    5      5  15  25   35
    6      6  16  26   36
    7      7  17  27   37
    8      8  18  28   38
    

    【讨论】:

      猜你喜欢
      • 2019-12-15
      • 2018-09-04
      • 2021-12-04
      • 2016-12-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-10
      • 2012-09-20
      相关资源
      最近更新 更多