根据另一个数据框中的行顺序重新排列数据框中的行。

6
我是一名新的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,尽管我不确定是否需要使用它们。实际上,这些数据框具有更多列,但出于简洁考虑,我只包含了两列。

根据这里的问题 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

但是现在当我执行 head(dfmax) 命令时,会得到以下结果:
[1] V1 V2
<0 rows> (or 0-length row.names)

我无法理解它,当我执行str(dfmax)时,字符变量的排序方式与之前相同,没有发生任何变化。我是否走错了路?还有其他方法可以解决这个问题吗?或者我是否未正确地执行此函数?

非常感谢你的时间和帮助。

1个回答

15

我不愿意接受match无法使用的说法。它确实返回可能不唯一的结果,但是你没有提到需要进行第二次排序,如果需要的话,可以将其作为第二个参数轻松添加到order中。我在第二个数据帧的各种缩小的子集中进行了测试,其中包括每个variable实例仅出现一次的数据。

长度的差异不应该是一个问题。这里我首先演示了通过d1(“dfverif”,较长)对d2(“dfmax”,较短)进行排序,然后对d1按d2进行排序:

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

我现在明白了,但是使用order(match(, ))仍然应该成功,不是吗? - IRTFM
我的答案实际上产生了错误的结果,所以我删除了它。你的方法是正确的 :) - talat
1
在我制作的测试用例中运行良好;您应该将 dput(head(dfmax))dput(head(dverif)) 的输出作为编辑发布在您的问题中。 - IRTFM
我必须保存数据框,然后带有标题读取它们,并为它们命名列,然后它就可以工作了。非常感谢! :) - abishop

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接