4

我有一个更大的数据框的一部分:

[7111,] 20100321  0.8000000  
[7112,] 20100321  0.1000000  
[7113,] 20100322  0.3000000  
[7114,] 20100324  0.4000000  
[7115,] 20100324  0.2000000  
[7116,] 20100325  0.4000000  
[7117,] 20100326  0.7000000  
[7118,] 20100327  0.4000000 
[7119,] 20100328  0.1000000  
[7120,] 20100328  0.9000000  
[7121,] 20100328  0.2000000   
[7122,] 20100329  0.7000000  

第一列包含日期,第二列包含在该日期进行测量的时间点(例如:0.0 = 00:00 小时和 0.5 = 12:00 小时)。正如你所看到的,有些日期有不止一个测量值。

这就是我想要做的:我想在特定日期从低到高对每个日期的时间数据进行排序,并根据此顺序添加一个数字(1 是最早的测量值,之后是 2...3 等等。得到这样的东西:

[7111,] 20100321  0.1000000    1  
[7112,] 20100321  0.8000000    2
[7113,] 20100322  0.3000000    1
[7114,] 20100324  0.2000000    1
[7115,] 20100324  0.4000000    2
[7116,] 20100325  0.4000000    1
[7117,] 20100326  0.7000000    2
[7118,] 20100327  0.4000000    1
[7119,] 20100328  0.1000000    1
[7120,] 20100328  0.2000000    2
[7121,] 20100328  0.9000000    3
[7122,] 20100329  0.7000000    1

有谁知道如何做到这一点?帮助会很棒!

4

2 回答 2

4

您可以使用order您的data.frame然后使用ave非常快速地创建第三列:

df <- df [ order( df$V1 , df$V2 ) , ]
df$ID <- ave( df$V2 , df$V1 , FUN = function(x) 1:length(x) )
#        V1  V2 ID
#2  20100321 0.1  1
#1  20100321 0.8  2
#3  20100322 0.3  1
#5  20100324 0.2  1
#4  20100324 0.4  2
#6  20100325 0.4  1
#7  20100326 0.7  1
#8  20100327 0.4  1
#9  20100328 0.1  1
#11 20100328 0.2  2
#10 20100328 0.9  3
#12 20100329 0.7  1

ave获取数据帧的子集,并为每个子集返回一个向量,从 1 到当前子集nrow(x)在哪里。x它将它们作为一个长向量返回,我们将其附加到,然后在我的示例中data.frame按日期列排序,然后按列排序。V1ID

于 2013-05-10T14:54:31.203 回答
0

您可以ddplyplyr包中使用:

library(plyr)
ddply(ddply(x,c("date","time"),identity),"date",transform,order=seq_along(date))
       date time order
1  20100321  0.1     1
2  20100321  0.8     2
3  20100322  0.3     1
4  20100324  0.2     1
5  20100324  0.4     2
6  20100325  0.4     1
7  20100326  0.7     1
8  20100327  0.4     1
9  20100328  0.1     1
10 20100328  0.2     2
11 20100328  0.9     3
12 20100329  0.7     1

您会注意到我调用ddply了两次:一次是对 2 个变量的初始输出进行排序(本order可以在此处使用),第二次通过添加顺序变量来转换它(仅取决于 1 个变量date)。

于 2013-05-10T15:24:24.253 回答