我有一系列資料幀,我需要對主資料幀進行交叉檢查,并為每次檢查回傳一個資料幀。必須為每個資料幀寫出反連接有點乏味。
例如,我想將所有資料幀與“d1”進行比較,并為每次比較生成一個資料幀。
d1 <- data.frame(su = c("c", "d", "c"))
d2 <- data.frame(su = c("c", "e", "d"))
d3 <- data.frame(su = c("c", "d", "f"))
我已經寫了一個函式來執行 anti_joins ...
perform_anti_join <- function(master_df, checking_df) {
joined_dfs <- master_df %>%
anti_join(checking_df, by = "su")
return(joined_dfs)
}
我基本上想使用我上面的函式創建一個回圈,該回圈將采用一系列資料幀(例如 df2、df3)并將其與主 df(df1)和每個資料幀進行比較以生成結果的資料幀。所以在這個例子中,我會有 2 個資料幀,一個檢查 df1 - df2,一個檢查 df1 - df3。
有沒有人能夠向我展示一種可以自動執行此操作的方法?
TIA
uj5u.com熱心網友回復:
對多個值執行相同操作的最簡單方法是將它們放在一個串列中。然后你可以使用類似的函式purrr:map來遍歷這個串列(注意它purrr在 tidyverse 中,所以它可能已經被加載)。例如
library(purrr)
map(list(d2, d3), ~perform_anti_join(d1, .x))
將接受d2并將d3其傳遞給perform_anti_join第二個引數。您可以在串列中放入任意數量的物件。
您還可以選擇將其包裝在一個函式中,以便更輕松地創建串列和主表
check_all <- function(master, ...) {
map(list(...), ~perform_anti_join(master, .x))
}
check_all(d1, d2, d3)
這里我們...用來捕獲第一個之后的所有引數。
uj5u.com熱心網友回復:
我提出以下解決方案。首先,收集幀,或者更確切地說,將tibbles 收集到一個集合中,tibble如下所示:
library(tidyverse)
df = tibble(
df = list(
tibble(su = c("c", "d", "c")),
tibble(su = c("c", "e", "d")),
tibble(su = c("c", "d", "f")),
tibble(su = c("a", "b", "c", "d")),
tibble(su = c("b", "d", "f", "g"))
),
id = 1:length(df)
)
接下來是您的perform_anti_join功能,但經過最低限度的簡化
perform_anti_join = function(master_df, checking_df) master_df %>%
anti_join(checking_df, by = "su")
現在讓我們與第四個進行比較 tibble
master_df = df$df[[4]]
dfperf = df %>% group_by(id) %>%
mutate(perform_anti_join = map(df, ~perform_anti_join(master_df, .x)))
輸出
# A tibble: 5 x 3
# Groups: id [5]
df id perform_anti_join
<list> <int> <list>
1 <tibble [3 x 1]> 1 <tibble [2 x 1]>
2 <tibble [3 x 1]> 2 <tibble [2 x 1]>
3 <tibble [3 x 1]> 3 <tibble [2 x 1]>
4 <tibble [4 x 1]> 4 <tibble [0 x 1]>
5 <tibble [4 x 1]> 5 <tibble [2 x 1]>
所以讓我們看看這里有什么
dfperf$perform_anti_join[[1]]
# A tibble: 2 x 1
# su
# <chr>
# 1 a
# 2 b
dfperf$perform_anti_join[[5]]
# A tibble: 2 x 1
# su
# <chr>
# 1 a
# 2 c
希望你喜歡。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/315292.html
上一篇:條件滿足時填充nan值
