【问题标题】:R - How to rearrange entire rows using subset of dataR - 如何使用数据子集重新排列整行
【发布时间】:2016-07-12 10:40:57
【问题描述】:

我对 2 个数据帧的 colB 进行了逐行比较(两个数据帧具有相同的有序列),我发现它们 98% 相同,并且两列之间的唯一区别是一些值对像这样切换:

df1$colB   df2$colB
   A          B
   B          A
   1          1 
   C          D 
   D          C

我取了 df1$colB 不等于 df2$colB 时的子集

subset(df1, df1$colB != df2$colB)

有没有办法使用上面子集中的行来重新排列 df1 的整个行,以便 df1$colB 和 df2$colB 中的所有值现在都匹配?

【问题讨论】:

  • 这将有助于添加更多的模式(可能 10 行)和更多的列。正确的解决方案取决于模式,因此提供更多数据细节会有所帮助。
  • 你需要order他们两个。通常的语法类似于mtcars[order(mtcars$drat),],您需要对两者都这样做。连接也是一种可能; dplyr::anti_join 可能特别有用。
  • 不太清楚你想做什么,但merge 可能会引导你走向正确的方向?
  • 我简化了我的问题。我只想知道如何使用来自数据子集的行出现重新排列数据帧的整行

标签: r comparison row col


【解决方案1】:

我认为subset 不适合此功能。它需要一个逻辑向量作为第二个参数,(令人困惑地)也称为“子集”,因此没有排序能力。而是使用match[

 df1[ match(df1$colB,  df2$colB), ]
  X1.5 colB
2    2    B
1    1    A
3    3    1
5    5    D
4    4    C

但是在使用稍微复杂一点的 df2 版本进行测试后,该版本在 colB 中具有 NA 和其他值,我决定 @Ananta 对 merge 的建议是更安全的方法(但将 df2 作为第一个参数获得所需的顺序):

> merge( df2,df1)[ names(df1) ]
  X1.5 colB
1    3    1
2    1    A
3    2    B
4    4    C
5    5    D

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-20
    • 1970-01-01
    • 2020-08-16
    • 2022-10-13
    • 2013-10-21
    • 2020-10-13
    • 1970-01-01
    相关资源
    最近更新 更多