【问题标题】:R - Compare two columns from different datasets and get new datasetR - 比较来自不同数据集的两列并获取新数据集
【发布时间】:2021-02-16 13:51:28
【问题描述】:

我有两个数据集。对于每个数据集,每两列是一对,*a 作为第一列,*b 作为第二列。

例如df1,对 A1,df1$A1a = 第一列 & df1$A1b = 第二列。

同样,df2,对 B1,df2$B1a = 第一列 & df2$B1b = 第二列。

df1:

ID A1a A1b A2a A2b
1  2   3   2   3
2  3   1   2   1 
3  1   3   1   2
4  2   2   3   3
5  1   2   2   1 

df2:

ID B1a B1b B2a B2b
1  1   2   2   3
2  3   2   1   1 
3  2   3   2   2
4  3   2   2   3
5  2   2   3   1  

最终数据 (df3) 应如下所示:

ID C1a C1b C2a C2b
1  1   2   2   3
2  3   1   1   1 
3  1   3   1   2
4  2   2   2   3
5  1   2   2   1  

我想做以下事情:

  1. 首先,比较 df1 和 df2 之间每对的第一列并确定最小值。例如。对于 ID=1,比较 df1$A1a = 2 和 df2$B1a = 1,因为 df2$B1a 具有较低的值,所以使用 df2 中的对来改变新列。 IE。 df3$C1a = 1,df3$C1b = 2。
  2. 如果每对的第 1 列相同,则使用第 2 列来确定哪些值对来改变新列。例如。对于 ID=2,第一列显示 df1$A1a = 3 和 df2$B1a = 3,因此使用第二列来确定,因为 df1$A1b = 1 和 df2$B1b = 2,值对应该来自 df1。 IE。 df3$C1a = 3 和 df3$C1b = 1。
  3. 如果 df1 和 df2 中的两个对相同,则使用这些值。例如。对于 ID=1,第一列 df1$A2a = 2 和 df2$B2a = 2 相同,第二列 df1$A2b = 3 和 df2$B2b = 3 相同,则新列应为 df3$C1a = 2和df3$C1b = 3。

希望自动执行上述操作,以便代码自动比较 df1 和 df2 中的每一对,这样我就不需要单独比较这些对(例如,先做 A1 和 B1,然后做 A2 和 B2 等),而是代码只是对数据集中的每一对重复。感谢您的帮助!

【问题讨论】:

    标签: r if-statement dplyr


    【解决方案1】:

    这有点太长了,但它仍然可以解决问题。

    map2(
      list(df1, df2), c("A", "B"),
      function(df, df_chr){
        df %>% pivot_longer(cols=-ID, values_to=df_chr) %>%
          mutate(name=str_replace(name, df_chr, "")) %>% return()
      }
    ) %>% reduce(left_join, by=c("ID", "name")) %>%
      mutate(name=name %>% str_split(""), id1=map_chr(name, ~ .[[1]]),
             id2=map_chr(name, ~ .[[2]]), .after=ID) %>%
      select(-name) %>% nest(data=-c(ID, id1)) %>%
      mutate(data=map(data, function(data){
        if((data %>% slice(1) %>% .$A) != (data %>% slice(1) %>% .$B)){
          min_col_num <- (data %>% slice(1) %>% select(-id2) %>% which.min() %>% unname()) + 1
          data %>% select(id2, value=min_col_num) %>% return()
        }else{
          min_col_num <- (data %>% slice(2) %>% select(-id2) %>% which.min() %>% unname()) + 1
          data %>% select(id2, value=min_col_num) %>% return()
        }
      })) %>% unnest(cols=data) %>% mutate(name=str_c("C", id1, id2), .after=ID) %>%
      select(-c(id1, id2)) %>% pivot_wider()
    

    【讨论】:

    • 我试过了,但不知道为什么会返回这个错误Error in is_symbol(x) : object 'min_colname' not found
    • 很抱歉,我忘记了 !! 的工作原理,这导致了错误。请找到我更新的答案。尽管它可能会显示警告,但它会提供预期的输出。
    • 尝试了更新的答案,现在可以使用了,谢谢!
    猜你喜欢
    • 2023-02-03
    • 2015-01-02
    • 1970-01-01
    • 1970-01-01
    • 2022-01-02
    • 1970-01-01
    • 1970-01-01
    • 2018-04-12
    • 1970-01-01
    相关资源
    最近更新 更多