【问题标题】:compare two data frame and change one data frame in R比较两个数据帧并在R中更改一个数据帧
【发布时间】:2013-03-01 20:37:46
【问题描述】:

在 R 中,我有 2 个数据帧“df1”和“df2”。它们如下:

> df1
   date        value
1  1980-12-10       5
2  1980-12-11       5
3  1980-12-12       5
4  1980-12-13       5
5  1980-12-14       5


>df2
   date        value
1  1980-12-10       15
2  1980-12-11       2
3  1980-12-12       23
4  1980-12-13       44
5  1980-12-14       434
6  1980-12-15       242
7  1980-12-16       22
8  1980-12-17       82
9  1980-12-18       723
10 1980-12-19       72

我想更改“df2”。仅当 df1 与 df2 具有相同的日期时,df2 才必须包含这些值。 实际上我需要以下输出:

>df2
   date        value
1  1980-12-10       15
2  1980-12-11       2
3  1980-12-12       23
4  1980-12-13       44
5  1980-12-14       434

在 R 中有可能吗?

【问题讨论】:

    标签: r dataframe


    【解决方案1】:

    你可以只使用子集和%in%:

    df2[df2$date%in%df1$date,]
            date value
    1 1980-12-10    15
    2 1980-12-11     2
    3 1980-12-12    23
    4 1980-12-13    44
    5 1980-12-14   434
    

    【讨论】:

      【解决方案2】:
      # read in both data frames
      df1 <-
          read.table( h = TRUE , text = "date        value
          1980-12-10       5
          1980-12-11       5
          1980-12-12       5
          1980-12-13       5
          1980-12-14       5")
      
      df2 <-
          read.table( h = TRUE , text = "date        value
          1980-12-10       15
          1980-12-11       2
          1980-12-12       23
          1980-12-13       44
          1980-12-14       434
          1980-12-15       242
          1980-12-16       22
          1980-12-17       82
          1980-12-18       723
          1980-12-19       72")
      
      # merge df1 and df2, only keeping the date column from df1
      # but note no comma, which maintains the `class` of df1,
      # allowing the merge to work appropriately
      merge( df1[ 'date' ] , df2 )
      
      # and if you wanted to overwrite df2 with the new results:
      df2 <- merge( df1[ 'date' ] , df2 )
      

      【讨论】:

        【解决方案3】:

        你可以使用sqldf,做一个SQL INNER JOIN(R merge),例如:

        library(sqldf)
        sqldf('SELECT df2.*
               FROM df2
               INNER JOIN df1
               ON df1.date = df2.date')
                date value
        1 1980-12-10    15
        2 1980-12-11     2
        3 1980-12-12    23
        4 1980-12-13    44
        5 1980-12-14   434
        

        【讨论】:

          猜你喜欢
          • 2019-06-23
          • 1970-01-01
          • 2017-04-26
          • 2019-07-21
          • 2021-01-24
          • 1970-01-01
          • 2018-10-30
          • 2021-09-16
          相关资源
          最近更新 更多