假设我们在 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:
- a$col3 将由数据框“b”的 col1 中值的序列号列表组成。
- 将选择那些 b$col1 的值,其中 a$col1 落在每一行的 b$col2 和 b$col3 的值之间。
- 此外,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
(dplyr
、stringr
和 purrr
)你可以做这样的事情......
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/