R - 比较 R 中 2 个数据帧之间的数据

标签 r loops dataframe dplyr compare

假设我们在 R 中有 2 个数据帧。

a = data.frame(col1 = round(runif(6,1,20)),col2 = c("a b c","b e z","a c q","a b","w","u o p l"), stringsAsFactors = F)
b = data.frame(col1 = 1:10, col2 = round(runif(10,1,10)), col3 = round(runif(10,10,20)), col4 = c(paste(letters[1:15], collapse=" "),paste(letters[10:25], collapse=" "),paste(letters[1:15], collapse=" "),paste(letters[1:19], collapse=" "),paste(letters[10:15], collapse=" "),paste(letters[1:15], collapse=" "),paste(letters[20:25], collapse=" "),paste(letters[1:15], collapse=" "),paste(letters[3:26], collapse=" "),paste(letters[1:2], collapse=" ")),stringsAsFactors = F)

数据集是:

a
 col1    col2
   15   a b c
    8   b e z
   11   a c q
   15     a b
    5       w
   12 u o p l

b
col1 col2  col3                                           col4
1     1     10                   a b c d e f g h i j k l m n o
2     2     12                 j k l m n o p q r s t u v w x y
3     4     12                   a b c d e f g h i j k l m n o
4     4     16           a b c d e f g h i j k l m n o p q r s
5     2     13                                     j k l m n o
6     3     15                   a b c d e f g h i j k l m n o
7     1     12                                     t u v w x y
8     2     18                   a b c d e f g h i j k l m n o
9     4     16 c d e f g h i j k l m n o p q r s t u v w x y z
10    3     12                                             a b

我想根据以下几点在数据框“a”中创建第 3 列 col3:

  1. a$col3 将由数据框“b”的 col1 中值的序列号列表组成。
  2. 将选择那些 b$col1 的值,其中 a$col1 落在每一行的 b$col2 和 b$col3 的值之间。
  3. 此外,a$col2 中的字母应该出现在 b$col4 中。 (不需要排序。例如,“a s”等同于“s a”。)

最终需要的数据集。

a
 col1    col2     col3
   15   a b c    4 6 8
    8   b e z   
   11   a c q      4 9
   15     a b    4 6 8
    5       w    2 7 9
   12 u o p l      2 9

提醒一句—— For 循环解决方案将不起作用,因为我使用的数据框很大。 (有数百万行)。任何其他方法将不胜感激。

提前致谢。

最佳答案

使用 tidyverse(dplyrstringrpurrr)你可以做这样的事情......

 a2 <- b %>% mutate(col5=map2(col2,col3,~seq(.x,.y,1))) %>% #expand b to include all values between col2 and col3
  unnest() %>% 
  inner_join(a,by=c("col5"="col1")) %>% #match these against a col1
  filter(map2_lgl(col2.y,col4,~all(str_detect(.y,unlist(strsplit(.x," ")))))) %>% #filter by string matches
  group_by(col5,col2.y) %>% #group by original a columns
  summarize(col3=paste(sort(col1),collapse=" ")) %>% #collapse matching b col1 values
  right_join(a,by=c("col5"="col1","col2.y"="col2")) %>% #merge back into a
  rename(col1=col5,col2=col2.y) #restore column names

由于您的随机化过程,我得到了不同的数据帧(顺便说一句,sample() 可能比 round(runif()) 更好) ,但这就是我最终得到的......

> a
  col1    col2
1    7   a b c
2    5   b e z
3   10   a c q
4   14     a b
5    4       w
6    2 u o p l

> b
   col1 col2 col3                                            col4
1     1    4   11                   a b c d e f g h i j k l m n o
2     2   10   15                 j k l m n o p q r s t u v w x y
3     3    4   19                   a b c d e f g h i j k l m n o
4     4    8   13           a b c d e f g h i j k l m n o p q r s
5     5    7   13                                     j k l m n o
6     6    2   14                   a b c d e f g h i j k l m n o
7     7    8   11                                     t u v w x y
8     8    8   19                   a b c d e f g h i j k l m n o
9     9   10   19 c d e f g h i j k l m n o p q r s t u v w x y z
10   10    8   16                                             a b

> a2
# A tibble: 6 x 3
# Groups:   col1 [6]
   col1 col2    col3    
  <dbl> <chr>   <chr>   
1    7. a b c   1 3 6   
2    5. b e z   NA      
3   10. a c q   4       
4   14. a b     3 6 8 10
5    4. w       NA      
6    2. u o p l NA

关于R - 比较 R 中 2 个数据帧之间的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49883323/

相关文章:

mysql - 在 MySQL 或 R 中 reshape 表

r - 按 R 中的日期序列和 id 变量聚合

while 循环中的 c++ 声明和初始化变量

java - for 循环的运行时,其中变量依赖于外部循环

python - 使用索引标签创建新的Pandas DataFrame(iloc错误: Flexible Type)

r - 如何使用包含 "<"-operator 的条目执行计算?在这种情况下,将上限除以二

r - r中的三向颜色渐变填充

loops - While 循环使用 Await Async。

python - 将季度数据框转换为每月数据框并填充每个 ID 的缺失值

python - 使用重复条件过滤 Python 中的行