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