根据另一个数据帧中的行顺序重新排序数据帧中的行

时间:2014-12-08 16:46:19

标签: r dataframe rows

我是一名新的R用户,也是StackOverflow的新用户。我会尽力简明扼要地问我的问题,如果没有以最好的方式传达我的道歉。

我正在处理两个数据帧。我想重新排序一个数据帧的行,使其与第二个数据帧中的行的顺序相同,这样我就可以将数据从一个添加到另一个,其格式相同。我想根据行重新排序的列是具有不同观察区域的字符串标识符的列。

第一个数据帧“dfverif”看起来(总结)像

Variable Value  
DAFQX   9   
DAFQX   9   
DAFQX   9   
DAFQX   9   
DAHEI   9   
DAHEI   9   
DAHEI   9   
DAHEI   9   
BAARG   9       
BAARG   9       
BAARG   9   
BAARG   9   
CBUCG   9   
CBUCG   9   
CBUCG   9   
CBUCG   9   
DALZZ   9   
DALZZ   9   
DALZZ   9   
DALZZ   9   

第二个数据帧“dfmax”看起来像

variable value
DALZZ   2.14
DALZZ   2.02
DALZZ   2.04
CBUCG   1.83
CBUCG   2.09
CBUCG   1.96
CBUCG   1.98
DAHEI   2.25
DAHEI   2.05
DAHEI   2.08
DAFQX   2.12
DAFQX   2.12
DAFQX   2.04
BAARG   2.12
BAARG   2.56
BAARG   2.56

我想根据第一个数据帧中字符向量的行顺序重新排序第二个数据帧的行。但是,有许多重复的字符串,因为这是时间序列数据,所以我不能使用匹配,我不能删除重复项,因为它们保存必要的数据。此外,第二个数据帧远小于第一个数据帧(它是时间序列数据的最大值而不是原始观测值)。我知道限制cbind和rbind,但是如果需要可以使用rbind.fill和cbindX,虽然我不确定它们是否在这里。实际上这些数据帧有更多的列,但为了简洁,我在这里仅包括2个。

基于此处的问题Order data frame rows according to a target vector that specifies the desired order

我尝试过做那段代码

target <- dfverif
idx <- sapply(target,function(x){
which(dfmax$variable==x)
})
idx <- unlist(idx) ##I added this because the code gave me errors because idx is classified as a list so R couldn't do the dfmax[idx,] component
dfmax <- dfmax[idx,]
rownames(dfmist) <- NULL

但现在当我做头(dfmax)时,我得到了

[1] V1 V2
<0 rows> (or 0-length row.names)

我无法理解,当我做str(dfmax)时,我获得了与之前相同的字符变量排序,没有任何改变。我吠叫错了树吗?有没有其他方法来解决这个我不知道的方法?或者我是否试图不正确地执行此功能?

感谢您的时间和帮助。

1 个答案:

答案 0 :(得分:5)

我不愿意接受match无法使用。它确实返回了一个可能非唯一的结果,但您没有说出需要进行二次排序的任何内容,如果您这样做,可以很容易地将其添加为order的第二个参数。我在第二个数据帧的各种简化子集上测试了这个,包括一个只有variable个实例的单个实例的子集。

长度的差异不应成为问题。在这里,我先说明d2('dfmax',更短)的顺序为d1('dfverif',更长),然后按d2排序d1:

d2[ order(match(d2$variable, d1$Variable)), ]
   variable value
11    DAFQX  2.12
12    DAFQX  2.12
13    DAFQX  2.04
8     DAHEI  2.25
9     DAHEI  2.05
10    DAHEI  2.08
14    BAARG  2.12
15    BAARG  2.56
16    BAARG  2.56
4     CBUCG  1.83
5     CBUCG  2.09
6     CBUCG  1.96
7     CBUCG  1.98
1     DALZZ  2.14
2     DALZZ  2.02
3     DALZZ  2.04
d1[ order(match(d1$Variable, d2$variable)), ]

   Variable Value
17    DALZZ     9
18    DALZZ     9
19    DALZZ     9
20    DALZZ     9
13    CBUCG     9
14    CBUCG     9
15    CBUCG     9
16    CBUCG     9
5     DAHEI     9
6     DAHEI     9
7     DAHEI     9
8     DAHEI     9
1     DAFQX     9
2     DAFQX     9
3     DAFQX     9
4     DAFQX     9
9     BAARG     9
10    BAARG     9
11    BAARG     9
12    BAARG     9