【问题标题】:How to compare two data frames and extract data effectivily in R如何在 R 中比较两个数据框并有效地提取数据
【发布时间】:2014-07-22 09:53:33
【问题描述】:

我想比较两个数据帧,但是它们很长,而且我现在的代码需要一个多小时才能运行。今年的数据将与去年的数据进行比较,如果匹配,则将其放置在 Approve-data 框中。我怎样才能更有效地做到这一点?

数据帧中有超过 20 000 行...

p = 1                                                                 
k = Start
l = Stop
for(i in 1:nrow(NewData))
{
  Year = substrYear(NewData, i)
  Month = substrMonth(NewData, i)
  Day = substrDay(NewData, i)
  y = NewData$Time[i]
  z = NewData$B[i]
  w = NewData$C[i]
  for(j in k:l)
  { 
    if ( Year == as.numeric(substrYear(OldData, j)) + 1
         & Month == substrMonth(OldData, j)
         & Day == substrDag(OldData, j)
         & y == OldData$Time[j]
         & z == OldData$B[j]
         & w == OldData$C[j])
    {  

      ANewData[p,] = NewData[i,] # Approved
      AOldData[p,] = OldData[j,] # Approved
      p = p+1 
      next

    }
  }
}

我从 Excel 获取数据。这部分没问题。当涉及到 R 时,我已经对其进行了结构化。

这是历史 Excel 文件的一部分。新数据类似。

Date        Time    Station         Place       Klass       Cars    
01/05/2013  00:00   Klett - Rv.707, S-snitt KLETT-1     Big     1   
01/05/2013  00:00   Klett - Rv.707, S-snitt KLETT-1     Small       30  
01/05/2013  00:00   Klett - Rv.707, S-snitt KLETT-2     Unknown     2   
01/05/2013  00:00   Klett - Rv.707, S-snitt KLETT-2     Big     1   
01/05/2013  00:00   Klett - Rv.707, S-snitt KLETT-2     Small       35  
01/05/2013  00:00   Klett - E6, S-snitt KLE-1-E6    Unknown     4   
01/05/2013  00:00   Klett - E6, S-snitt KLE-1-E6    Big     18  
01/05/2013  00:00   Klett - E6, S-snitt KLE-1-E6    Small       160 
01/05/2013  00:00   Klett - E6, S-snitt KLE-2-E6    Unknown     2   
01/05/2013  00:00   Klett - E6, S-snitt KLE-2-E6    Big     4
01/05/2013  00:00   Klett - E6, S-snitt KLE-2-E6    Small       165 

这些被转换成这个,将它们编码为数据帧。

Date        Time    Station         Place       Small   Big Unknown
01/05/2013  00:00   Klett - Rv.707, S-snitt KLETT-1     30  1   0
01/05/2013  00:00   Klett - Rv.707, S-snitt KLETT-2     35  1   2
01/05/2013  00:00   Klett - E6, S-snitt KLE-1-E6    160 18  4
01/05/2013  00:00   Klett - E6, S-snitt KLE-2-E6    165 4   2

然后我想比较两个数据帧,按日期、时间、站点和地点。如果匹配,则将OldData 的值放在AOldData 中,将NewData 的值放在ANewData 中。

从这里我将在每个矩阵(或数据框)中为 Station 和 place 求和 SmallBigUnknown 值。我想用ddply

【问题讨论】:

  • 能否请您发布您的 data.frame 的第一行,以便我们了解您的 data.frame 的结构?您是在谈论 R 中的实际 data.frame 对象还是仍然需要从文本文件中读取它?
  • 除了向您的问题添加两个 minimal 输入数据帧(5、10、20 行?)之外,还提供所需的输出。还要更详尽地用文字描述您希望达到的目标。
  • 似乎你最好把你的日期变成数字等价物而不是无数个substr*电话。
  • Klett - Rv.707, S-snitt KLETT-1 的哪一部分是StationPlace 是哪一部分?
  • Klett-1 是 Place,Klett - Rv.707,S-snitt 是 Station。我看到那些没有按应有的方式出现......通常,时间和数字之间的最后 7 个字符是地方。

标签: r compare dataframe


【解决方案1】:

是的,我迟到了;-)

没有数据很难回答...

如果新旧data.frame的行和列的数量和顺序完全匹配:

您可以尝试将要比较的列从新旧 data.frame 中提取到两个新数据框中(仅包含应相等的列!)

然后简单地比较它们:

diff <- old.data.frame == new.data.frame # creates a data.frame of TRUE/FALSE for each "cell"; I guess you called these data.frames "AOldData" and "ANewData" in your question above
colSums( diff ) # shows you the number of matches per column (TRUE = match = equal)

如果新旧data.frame的行列数和顺序不完全匹配:

通过“连接”(合并命令或带有 SQL 查询的 sqldf 包)匹配相应的行,并像上面一样比较生成的 data.frame(例如,通过将列拆分为两个 data.frame)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-10
    • 1970-01-01
    • 2018-04-01
    • 1970-01-01
    相关资源
    最近更新 更多