Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 比较两个数据帧并创建具有唯一元素的新数据帧_R - Fatal编程技术网

R 比较两个数据帧并创建具有唯一元素的新数据帧

R 比较两个数据帧并创建具有唯一元素的新数据帧,r,R,我有两个数据帧。我想对它们进行比较,并创建一个新的数据帧,其中包含df1的全名,而这些全名在df2中找不到。我试图在df1中查找名字,但其名字在df2中不存在 df1: df2: 我想用df2中找不到的名称创建一个新的数据帧 德福乌新酒店 unique_names 1 Sally Williams 2 John Murray 3 Marry Kelly Parker 您可以使用以下选项: setdiff(data_frame_name1, data_frame_name2) 或 或 您可

我有两个数据帧。我想对它们进行比较,并创建一个新的数据帧,其中包含df1的全名,而这些全名在df2中找不到。我试图在df1中查找名字,但其名字在df2中不存在

df1:

df2:

我想用df2中找不到的名称创建一个新的数据帧

德福乌新酒店

  unique_names
1 Sally Williams
2 John Murray
3 Marry Kelly Parker
您可以使用以下选项:

setdiff(data_frame_name1, data_frame_name2)


您可以
拆分
空白处的字符串,获取名字,然后查找
df2
名字中不存在的名字

df1[!sapply(strsplit(df1$names, "\\s+"),`[`, 1) %in% df2$first_names,, drop = FALSE]

#           names
#1 Sally Williams
#4    John Murray

或者采用
tidyverse
方法

library(tidyverse)

df1 %>%
  separate(names, into = c("first_names", "last_names")) %>%
  anti_join(df2) %>%
  unite(unique_names, sep = " ")

我们可以使用
regex\u-anti\u-join

library(fuzzyjoin)
regex_anti_join(df1, df2, by = c("names" = "first_names")) %>% 
       tibble(unique_names = .)
# A tibble: 2 x 1
#  unique_names  
#   <chr>         
#1 Sally Williams
#2 John Murray   
或者另一个选项是从
stringr
中提取名字,然后使用%
中的
%查找第二个数据集中匹配的元素,求反(
)并对第一个数据集的行进行子集

library(stringr)
df1N[!word(df1N$names, 1) %in% df2N$first_names,, drop = FALSE]
#               names
#1     Sally Williams
#4        John Murray
#5 Marry Kelly Parker
数据
df1所以你不想让任何人在df2列表中有名字?是的correct@kumkiee我展示了3种方法,它们都适用于您的两个示例。当我在strsplit(df1$names,“\\s+”)中运行上述代码错误时,我遇到了此错误:非字符argument@kumkiee
名称
似乎是一个因素。运行
df1$names我尝试了tidyverse方法,得到了以下错误消息:error:
by
required,因为数据源没有公共变量调用
rlang::last_error()
,以查看回溯。另外:警告消息:预期2条。在531行中丢弃的其他碎片[9、11、41、56、67、74、76、77、78、109、121、135、138、139、151、152、154、164、165、175等]。有些人有中间名。@Ronak Shah不幸的是,您更新的代码仍然只返回df1的名称。有些人有中间名,有些人甚至有两个中间名(James R.R.Williams)。这个代码还能用吗?我明白了。好吧,实际的数据帧有数百个名称,所以我不能把它们全部复制到这里。@Kumkie我明白,但我在这里找到了模式showed@kumkiee基于您发布的两个示例,它对我来说效果很好
anti_join(data_frame_name1, data_frame_name2)
df1[!sapply(strsplit(df1$names, "\\s+"),`[`, 1) %in% df2$first_names,, drop = FALSE]

#           names
#1 Sally Williams
#4    John Murray
library(tidyverse)

df1 %>%
  separate(names, into = c("first_names", "last_names")) %>%
  anti_join(df2) %>%
  unite(unique_names, sep = " ")
library(fuzzyjoin)
regex_anti_join(df1, df2, by = c("names" = "first_names")) %>% 
       tibble(unique_names = .)
# A tibble: 2 x 1
#  unique_names  
#   <chr>         
#1 Sally Williams
#2 John Murray   
regex_anti_join(df1N, df2N, by = c("names" = "first_names")) %>% 
       tibble(unique_names = .)
# A tibble: 3 x 1
#  unique_names      
#   <chr>             
#1 Sally Williams    
#2 John Murray       
#3 Marry Kelly Parker
library(dplyr)
df1N  %>% 
   mutate(first_names = word(names, 1)) %>%
   anti_join(df2N) %>% 
   select(names(df1N))
#               names
#1     Sally Williams
#2        John Murray
#3 Marry Kelly Parker
library(stringr)
df1N[!word(df1N$names, 1) %in% df2N$first_names,, drop = FALSE]
#               names
#1     Sally Williams
#4        John Murray
#5 Marry Kelly Parker
df1 <- structure(list(names = c("Sally Williams", "Tom Hacker", "Jane Turner", 
"John Murray")), class = "data.frame", row.names = c("1", "2", 
"3", "4"))

df2 <- structure(list(first_names = c("Kendall", "Tom", "Jane", "Sarah"
)), class = "data.frame", row.names = c("1", "2", "3", "4"))
df1N <- structure(list(names = c("Sally Williams", "Tom Hacker", 
 "Jane Turner", 
"John Murray", "Marry Kelly Parker", "David Carlson Smith")), 
 class = "data.frame", row.names = c("1", 
"2", "3", "4", "5", "6"))

df2N <- structure(list(first_names = c("Kendall", "Tom", "Jane", "Sarah", 
"David")), class = "data.frame", row.names = c("1", "2", "3", 
"4", "5"))