[英]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.