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

问题描述 投票:4回答:1

我是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

我想根据第一个数据帧中字符向量的行顺序对第二个数据帧的行进行重新排序。但是,有很多重复的字符串,因为这是时间序列数据,所以我不能使用match,也不能删除重复的字符串,因为它们包含必要的数据。同样,第二个数据帧比第一个数据帧小得多(它是时间序列数据的最大值,而不是原始观测值)。我知道限制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)时,我得到的字符变量与以前相同,但是没有任何变化。我在树上叫错了吗?还有另一种我不知道的解决方法吗?还是我试图不正确地执行此功能?

感谢您的时间和帮助。

r dataframe rows
1个回答
7
投票

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

长度的差异不应该成为问题。在这里,我首先演示d2(“ dfverif”,更长)按d1的排序,然后是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

0
投票

此解决方案对我有用。当您想按dataframe2的顺序重新排序dataframe1 --->时,上述解决方案有效]

© www.soinside.com 2019 - 2024. All rights reserved.