根据另一个数据帧中的部分字符串选择一个数据帧的值
selecting values of one dataframe based on partial string in another dataframe
我有两个数据帧(DF1 和 DF2)
DF1 <- as.data.frame(c("A, B","C","A","C, D"))
names(DF1) <- c("parties")
DF1
parties
A, B
C
A
C, D
.
B <- as.data.frame(c(LETTERS[1:10]))
C <- as.data.frame(1:10)
DF2 <- bind_cols(B,C)
names(DF2) <- c("party","party.number")
。
DF2
party party.number
A 1
B 2
C 3
D 4
E 5
F 6
G 7
H 8
I 9
J 10
所需的结果应该是 DF1 中的一个附加列,其中包含从 DF2 中获取的 DF1 中每一行的派对编号。
期望的结果(基于 DF1):
parties party.numbers
A, B 1, 2
C 3
A 1
C, D 3, 4
我强烈怀疑答案涉及 str_match
(DF1$parties, DF2$party.number) 或类似的正则表达式,但我不知道如何将两个 (或更多) 党号到同一行 (DF2$party.numbers).
一个选项是 gsubfn
通过将模式匹配为 upper-case 字母,作为替换使用 key/value list
library(gsubfn)
DF1$party.numbers <- gsubfn("[A-Z]", setNames(as.list(DF2$party.number),
DF2$party), as.character(DF1$parties))
DF1
# parties party.numbers
#1 A, B 1, 2
#2 C 3
#3 A 1
#4 C, D 3, 4
使用 tidyverse
的替代解决方案。您可以将 DF1
重塑为每行一个字符串,然后加入 DF2
然后重塑回您的初始形式:
library(tidyverse)
DF1 <- as.data.frame(c("A, B","C","A","C, D"))
names(DF1) <- c("parties")
B <- as.data.frame(c(LETTERS[1:10]))
C <- as.data.frame(1:10)
DF2 <- bind_cols(B,C)
names(DF2) <- c("party","party.number")
DF1 %>%
group_by(id = row_number()) %>%
separate_rows(parties) %>%
left_join(DF2, by=c("parties"="party")) %>%
summarise(parties = paste(parties, collapse = ", "),
party.numbers = paste(party.number, collapse = ", ")) %>%
select(-id)
# # A tibble: 4 x 2
# parties party.numbers
# <chr> <chr>
# 1 A, B 1, 2
# 2 C 3
# 3 A 1
# 4 C, D 3, 4
我有两个数据帧(DF1 和 DF2)
DF1 <- as.data.frame(c("A, B","C","A","C, D"))
names(DF1) <- c("parties")
DF1
parties
A, B
C
A
C, D
.
B <- as.data.frame(c(LETTERS[1:10]))
C <- as.data.frame(1:10)
DF2 <- bind_cols(B,C)
names(DF2) <- c("party","party.number")
。 DF2
party party.number
A 1
B 2
C 3
D 4
E 5
F 6
G 7
H 8
I 9
J 10
所需的结果应该是 DF1 中的一个附加列,其中包含从 DF2 中获取的 DF1 中每一行的派对编号。
期望的结果(基于 DF1):
parties party.numbers
A, B 1, 2
C 3
A 1
C, D 3, 4
我强烈怀疑答案涉及 str_match
(DF1$parties, DF2$party.number) 或类似的正则表达式,但我不知道如何将两个 (或更多) 党号到同一行 (DF2$party.numbers).
一个选项是 gsubfn
通过将模式匹配为 upper-case 字母,作为替换使用 key/value list
library(gsubfn)
DF1$party.numbers <- gsubfn("[A-Z]", setNames(as.list(DF2$party.number),
DF2$party), as.character(DF1$parties))
DF1
# parties party.numbers
#1 A, B 1, 2
#2 C 3
#3 A 1
#4 C, D 3, 4
使用 tidyverse
的替代解决方案。您可以将 DF1
重塑为每行一个字符串,然后加入 DF2
然后重塑回您的初始形式:
library(tidyverse)
DF1 <- as.data.frame(c("A, B","C","A","C, D"))
names(DF1) <- c("parties")
B <- as.data.frame(c(LETTERS[1:10]))
C <- as.data.frame(1:10)
DF2 <- bind_cols(B,C)
names(DF2) <- c("party","party.number")
DF1 %>%
group_by(id = row_number()) %>%
separate_rows(parties) %>%
left_join(DF2, by=c("parties"="party")) %>%
summarise(parties = paste(parties, collapse = ", "),
party.numbers = paste(party.number, collapse = ", ")) %>%
select(-id)
# # A tibble: 4 x 2
# parties party.numbers
# <chr> <chr>
# 1 A, B 1, 2
# 2 C 3
# 3 A 1
# 4 C, D 3, 4