【问题标题】:Sort rows to match multiple columns in another dataset对行进行排序以匹配另一个数据集中的多个列
【发布时间】:2021-12-04 15:42:27
【问题描述】:

我一直在尝试对我的数据集 (A2) 的行进行排序,以匹配另一个数据集 (A1) 的多个列。我曾经使用过一个代码,它工作得很好。今天我修改了代码以在新数据集上使用,我得到了我不应该得到的 NA。

这是我正在使用的代码

A4 <- A2[match(paste(A1$Subject,A1$Condition,A1$test, A1$Replication), paste(A2$Subject,A2$Condition,A2$test,A2$Replication)),]

数据:

A1 <- structure(list(Subject = c(1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 
2, 2, 2, 2), Condition = c(1, 1, 2, 2, 1, 1, 2, 2, 1, 1, 2, 2, 
1, 1, 2, 2), test = c(1, 1, 1, 1, 2, 2, 2, 2, 1, 1, 1, 1, 2, 
2, 2, 2), Replication = c(101, 108, 103, 105, 101, 108, 103, 
105, 101, 108, 103, 105, 101, 108, 103, 105), Movement = c(43, 
56, 45, 43, 35, 34, 34, 3, 4, 67, 45, 34, 65, 34, 345, 23)), row.names = c(NA, 
-16L), class = c("tbl_df", "tbl", "data.frame"))


A2 <-structure(list(Subject = c(2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 
1, 1, 1, 1, 1), Condition = c(1, 1, 2, 2, 1, 1, 2, 2, 1, 1, 
2, 2, 2, 1, 1, 2), test = c(1, 1, 1, 1, 2, 2, 2, 2, 1, 1, 1, 
1, 2, 2, 2, 2), Replication = c(108, 101, 103, 105, 101, 108, 
103, 105, 108, 101, 103, 105, 101, 108, 103, 105), Movement = c(43, 
56, 45, 43, 35, 34, 34, 3, 4, 67, 45, 34, 65, 34, 345, 23)), row.names = c(NA, 
-16L), class = c("tbl_df", "tbl", "data.frame")) 

【问题讨论】:

  • 您能否提供A2A4dput() 的示例数据框?这将使每个人的工作更轻松。
  • @Shibaprasadb,我刚刚添加了一些数据,谢谢
  • 您收到的是NA,因为A2 中不存在某些行组合。例如,查看A1 中的第 5 行在A2 中没有匹配项。您的预期输出是什么?
  • 谢谢,我根据您的评论返回了我的数据并修复了它

标签: r dataframe sorting


【解决方案1】:

您可以使用na.omit,也可以使用Reduce,让生活更轻松。

A2[na.omit(match(Reduce(paste, A1[-5]), Reduce(paste, A2[-5]))), ]
#    Subject Condition test Replication Movement
# 10       1         1    1         101       67
# 9        1         1    1         108        4
# 11       1         2    1         103       45
# 12       1         2    1         105       34
# 14       1         1    2         108       34
# 16       1         2    2         105       23
# 2        2         1    1         101       56
# 1        2         1    1         108       43
# 3        2         2    1         103       45
# 4        2         2    1         105       43
# 5        2         1    2         101       35
# 6        2         1    2         108       34
# 7        2         2    2         103       34
# 8        2         2    2         105        3

【讨论】:

    【解决方案2】:

    我们可以在dplyr 中使用slice

    library(dplyr)
    library(purrr)
    library(stringr)
    A2 %>% 
       slice(match(invoke(str_c, across(Subject:Replication,  ~ 
         A1[[cur_column()]])), invoke(str_c, across(Subject:Replication))))
    

    -输出

    # A tibble: 14 × 5
       Subject Condition  test Replication Movement
         <dbl>     <dbl> <dbl>       <dbl>    <dbl>
     1       1         1     1         101       67
     2       1         1     1         108        4
     3       1         2     1         103       45
     4       1         2     1         105       34
     5       1         1     2         108       34
     6       1         2     2         105       23
     7       2         1     1         101       56
     8       2         1     1         108       43
     9       2         2     1         103       45
    10       2         2     1         105       43
    11       2         1     2         101       35
    12       2         1     2         108       34
    13       2         2     2         103       34
    14       2         2     2         105        3
    

    【讨论】:

      【解决方案3】:

      您可以使用merge

      join_vars <- c('Subject', 'Condition', 'test', 'Replication')
      
      merge(A2, A1[, join_vars], by = join_vars, all.x = FALSE)
      
      #>    Subject Condition test Replication Movement
      #> 1        1         1    1         101       67
      #> 2        1         1    1         108        4
      #> 3        1         1    2         108       34
      #> 4        1         2    1         103       45
      #> 5        1         2    1         105       34
      #> 6        1         2    2         105       23
      #> 7        2         1    1         101       56
      #> 8        2         1    1         108       43
      #> 9        2         1    2         101       35
      #> 10       2         1    2         108       34
      #> 11       2         2    1         103       45
      #> 12       2         2    1         105       43
      #> 13       2         2    2         103       34
      #> 14       2         2    2         105        3
      

      reprex package 创建于 2021-10-17 (v2.0.1)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-01-04
        • 2020-06-12
        • 2014-10-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多