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

正在尝试在r代码中实现独占完全联接

实现了以下代码,该代码工作正常,但是正确的方法,因为过滤器充满了很多条件。因为这是示例代码,所以没有添加太多的列,但在实时场景中,我们有很多列,所以添加要筛选的列会使事情变得困难

还有其他更好的方法吗?

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”)
了解更多解释和示例。