gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 08:07:45 27 4
gpt4 key购买 nike

假设我们在 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com