【问题标题】:reordering rows in a dataframe according to the order of rows in another dataframe根据另一个数据框中的行顺序重新排序数据框中的行
【发布时间】:2014-12-08 16:46:19
【问题描述】:

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

但是现在当我做 head(dfmax) 我得到了

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

我无法理解,当我执行 str(dfmax) 时,我得到了与以前相同的字符变量顺序,没有任何改变。我在吠叫错误的树吗?还有另一种我不知道的方法来解决这个问题吗?还是我试图不正确地执行此功能?

感谢您的宝贵时间和帮助。

【问题讨论】:

    标签: r dataframe rows


    【解决方案1】:

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

    长度上的差异应该不是问题。在这里,我首先演示了 d2('dfmax',更短)按 d1('dfverif',更长)排序,然后是 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( , )) 应该仍然成功,不是吗?
    • 我的回答实际上产生了错误的结果,所以我将其删除。你的路要走:)
    • 在我制作的测试用例上运行良好;您应该在您的问题中发布dput(head(dfmax))dput(head(dverif)) 的输出作为编辑。
    • 我必须保存数据帧,然后用标题读入它们并给它们列名,然后它就可以工作了。非常感谢! :)
    猜你喜欢
    • 2021-10-11
    • 1970-01-01
    • 1970-01-01
    • 2021-01-24
    • 2020-08-04
    • 2018-01-16
    • 1970-01-01
    • 1970-01-01
    • 2023-03-16
    相关资源
    最近更新 更多