r中的独占完全加入
正在尝试在r代码中实现独占完全联接 实现了以下代码,该代码工作正常,但是正确的方法,因为过滤器充满了很多条件。因为这是示例代码,所以没有添加太多的列,但在实时场景中,我们有很多列,所以添加要筛选的列会使事情变得困难 还有其他更好的方法吗?r中的独占完全加入,r,join,R,Join,正在尝试在r代码中实现独占完全联接 实现了以下代码,该代码工作正常,但是正确的方法,因为过滤器充满了很多条件。因为这是示例代码,所以没有添加太多的列,但在实时场景中,我们有很多列,所以添加要筛选的列会使事情变得困难 还有其他更好的方法吗? library(tidyverse) persons = data.frame( name = c("Ponting", "Clarke", "Dave", "Bevan"), age = c(24, 32, 26, 29), col1 = c
library(tidyverse)
persons = data.frame(
name = c("Ponting", "Clarke", "Dave", "Bevan"),
age = c(24, 32, 26, 29),
col1 = c(1,2,3,4),
col2 = c("a", "z", "h", "p")
)
person_sports = data.frame(
name = c("Ponting", "Dave", "Roshan"),
sports = c("soccer", "tennis", "boxing"),
rank = c(8, 4, 1),
col3 = c("usa", "australia", "england"),
col4 = c("a", "f1", "z2")
)
persons %>% full_join(person_sports, by = c("name")) %>%
filter((is.na(age) & is.na(col1) & is.na(col2)) | (is.na(sports) & is.na(rank) & is.na(col3) & is.na(col4)))
输出:
尝试使用
complete.cases
。这将返回TRUE/FALSE向量,其中FALSE表示在至少一列中的给定行上发现NA
persons %>% full_join(person_sports, by = c("name")) %>% .[!complete.cases(.), ]
# name age col1 col2 sports rank col3 col4
# 2 Clarke 32 2 z <NA> NA <NA> <NA>
# 4 Bevan 29 4 p <NA> NA <NA> <NA>
# 5 Roshan NA NA <NA> boxing 1 england z2
最后,由于您提到您的实际数据集要大得多,您可能希望将其与data.table
解决方案进行比较,看看什么在您的真实数据中效果最好
library(data.table)
setDT(persons)
setDT(person_sports)
merge(persons, person_sports, by = "name", all = TRUE) %>% .[!complete.cases(.)]
# name age col1 col2 sports rank col3 col4
# 1: Bevan 29 4 p NA NA NA NA
# 2: Clarke 32 2 z NA NA NA NA
# 3: Roshan NA NA NA boxing 1 england z2
尝试使用
complete.cases
。这将返回TRUE/FALSE向量,其中FALSE表示在至少一列中的给定行上发现NA
persons %>% full_join(person_sports, by = c("name")) %>% .[!complete.cases(.), ]
# name age col1 col2 sports rank col3 col4
# 2 Clarke 32 2 z <NA> NA <NA> <NA>
# 4 Bevan 29 4 p <NA> NA <NA> <NA>
# 5 Roshan NA NA <NA> boxing 1 england z2
最后,由于您提到您的实际数据集要大得多,您可能希望将其与data.table
解决方案进行比较,看看什么在您的真实数据中效果最好
library(data.table)
setDT(persons)
setDT(person_sports)
merge(persons, person_sports, by = "name", all = TRUE) %>% .[!complete.cases(.)]
# name age col1 col2 sports rank col3 col4
# 1: Bevan 29 4 p NA NA NA NA
# 2: Clarke 32 2 z NA NA NA NA
# 3: Roshan NA NA NA boxing 1 england z2
谢谢你的回复。。。顺便问一下,
(.)
在complete.cases(.)
中表示什么,是.na(.)
,
是管道操作符中的点占位符。在右侧有
的任何位置,都将放置操作员的左侧。这样,您可以在右侧多次使用左侧,或在右侧第一个功能参数以外的位置使用左侧。查看帮助(“%>%”,package=“magrittr”)
了解更多解释和示例。感谢您的回复。。。顺便问一下,(.)
在complete.cases(.)
中表示什么,是.na(.)
,
是管道操作符中的点占位符。在右侧有
的任何位置,都将放置操作员的左侧。这样,您可以在右侧多次使用左侧,或在右侧第一个功能参数以外的位置使用左侧。查看帮助(“%>%”,package=“magrittr”)
了解更多解释和示例。