我有两个数据集。对于每个数据集,每两列都是一对,其中*a为第一列,*b为第二列。
例如df1,对A1,df1$A1a =第一栏和df1$A1b =第二栏。
同样,df2,对B1,df2$B1a =1列和df2$B1b =第2列。
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 我想做以下几点:
df1$A1a =2与df2$B1a =1进行比较,因为df2$B1a的值较低,因此使用来自df2的对突变新列。即df3$C1a = 1,df3$C1b =2.df1$A1a =3和df2$B1a = 3,因此使用第二列来确定,因为df1$A1b =1和df2$B1b = 2,所以值对应该来自df1。即df3$C1a =3和df3$C1b =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等等),而是对数据集中的每一对重复代码。谢谢你的帮助!
发布于 2021-02-16 15:11:06
这有点太长了,但它还是起了作用。
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()https://stackoverflow.com/questions/66225645
复制相似问题