繁体   English   中英

R相当于SAS“合并”“by”

[英]R equivalent to SAS “merge” “by”

如果您只使用SAS中的“merge”和“by”来合并包含多个具有相同名称的变量的数据集(在您合并的ID旁边),SAS将使用最后读取的值将这些变量合并为一个 - 它在这里描述https://communities.sas.com/t5/SAS-Programming/Merge-step-overwriting-shared-vars/mp/281542#M57117

上面的链接文字:

“有一条规则:最后读取的值。但只有在合并为一对一时,该规则才是简单的。在这种情况下,您获得的值取决于MERGE语句中的顺序:

合并ab;

通过id;

公共变量的值(对于一对一合并)来自数据集B.SAS从数据集A读取值,然后从数据集B读取值.B的值最后读取,并覆盖从数据集A读取的值

如果存在不匹配,并且ID仅出现在数据集A中但不出现在数据集B中,则该值将是在数据集A中找到的值。

如何在不必在某些条件之后合并行之后使R的行为方式相同? (在SAS中,值不会被NA覆盖)

library(tidyverse)
#create tibbles
df1 <- tibble(id = c(1:3), y = c("tt", "ff", "kk"))
df2 <- tibble(id = c(1,2,4), y = c(4,3,8))
df3 <- tibble(id = c(1:3), y = c(5,7,NA)) 
#combine the tibbles
combined_df <- list(df1, df2, df3) %>% 
reduce(full_join, by = "id")
# desired output
combined_df_desired <- tibble(id = 1:4, y = c(5,7,"kk",8))

我不确切地知道你对“某些条件”的意思。 没有办法改变full_join()的内部工作方式,但你可以这样做:

list(df1, df2, df3) %>% 
  reduce(full_join, by = "id") %>%
  mutate_all(as.character) %>%
  mutate(y = coalesce(y, y.y , y.x,)) %>%
  select(id, y)

 A tibble: 4 x 2
  id    y    
  <chr> <chr>
1 1     5    
2 2     7    
3 3     kk   
4 4     8   

coalesce()接受一组列并返回每行的第一个非NA值。 您可以根据优先级在函数内部排序列。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM