首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >比较来自不同数据集的两列并获得新的数据集。

比较来自不同数据集的两列并获得新的数据集。
EN

Stack Overflow用户
提问于 2021-02-16 13:51:28
回答 1查看 352关注 0票数 0

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

例如df1,对A1,df1$A1a =第一栏和df1$A1b =第二栏。

同样,df2,对B1,df2$B1a =1列和df2$B1b =第2列。

df1:

代码语言:javascript
运行
复制
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:

代码语言:javascript
运行
复制
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)应该如下所示:

代码语言:javascript
运行
复制
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的对突变新列。即df3$C1a = 1,df3$C1b =2.
  2. ,如果每对的第一列是相同的,那么使用第二列来确定要变异新列的值对。例如,对于ID=2,第一列显示df1$A1a =3和df2$B1a = 3,因此使用第二列来确定,因为df1$A1b =1和df2$B1b = 2,所以值对应该来自df1。即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等等),而是对数据集中的每一对重复代码。谢谢你的帮助!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-02-16 15:11:06

这有点太长了,但它还是起了作用。

代码语言:javascript
运行
复制
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()
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66225645

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档