Мы можем использовать map2
из пакета purrr , чтобы просмотреть два списка с intersect
. Результат может быть сохранен в новом столбце (в данном случае Compare
).
library(tidyverse)
df.lst2 <- df.lst %>%
mutate(Compare = map2(x.lst , y.lst, ~intersect(.x, .y)))
df.lst2$Compare
# [[1]]
# [1] "three" "four"
#
# [[2]]
# [1] "four" "five"
Обновление
Мы также можем использовать rowwise
с mutate
, как и в другом предложенном сообщении. Но для больших фреймов данных rowwise
может снизить производительность функции intersect
. Здесь я использовал пакет microbenchmark
для оценки этих двух методов в большом фрейме данных (10000 строк) с одинаковой структурой с df.lst
.
library(microbenchmark)
# Create a large data frame
df_large <- data.frame(
ID = 1:10000,
x = df$x,
y = df$y,
stringsAsFactors = FALSE
)
df_large <- df_large %>%
select(-ID) %>%
as.tibble()
df_large.lst <- df_large %>%
mutate(x.lst = str_extract_all(x, "[:alnum:]+"),
y.lst = str_extract_all(y, "[:alnum:]+")) %>%
glimpse()
# Observations: 10,000
# Variables: 4
# $ x <chr> "one two three four", "two three four five", "one two three four", "two three...
# $ y <chr> "three four five six", "four five six seven", "three four five six", "four fi...
# $ x.lst <list> [<"one", "two", "three", "four">, <"two", "three", "four", "five">, <"one", ...
# $ y.lst <list> [<"three", "four", "five", "six">, <"four", "five", "six", "seven">, <"three...
# Performance Evaluation
perm <- microbenchmark(
m1 = {df_large.lst2 <- df_large.lst %>%
mutate(xy.x = map2(x.lst , y.lst, ~intersect(.x, .y)))},
m2 = {df_large.lst2 <- df_large.lst %>%
rowwise() %>%
mutate(xy.x = list(intersect(x.lst, y.lst))) %>%
ungroup()},
m3 = {df_large.lst2 <- df_large.lst%>%
rownames_to_column () %>%
group_by(rowname) %>%
mutate(xy.x =list(intersect(unlist(x.lst),unlist(y.lst))))},
times = 100L
)
perm
# Unit: milliseconds
# expr min lq mean median uq max neval
# m1 158.8871 171.7935 183.0220 176.3373 191.0863 260.3079 100
# m2 353.1279 387.1014 405.2522 401.6800 422.6556 459.7453 100
# m3 436.0175 465.9106 496.4585 481.7983 527.7079 613.0461 100