![](/img/trans.png)
[英]Sum a variable in a grouped dataframe only once for each unique combination of two other variables with dplyr
[英]Save unique values of variable for each combination of two variables in a dataset
我有一個包含三個變量的(大)數據集。 對於 sub1 和 sub2 的每個組合,我想將所有唯一的 IV 保存在單獨的向量或數據集中,忽略 id,並使用變量“sub1.and.sub2.IV”命名。 由於我的數據集非常大,我想避免使用which
並自動提取所有組合。
id sub1 sub2 IV
<chr> <chr> <chr> <chr>
1 3 a a p
2 3 a a f
3 6 a b z
4 6 a b e
5 7 a c b
6 7 a c b
最后,我將擁有三個向量或數據集:
> a.and.a.IV
[1] "p" "f"
> a.and.b.IV
[1] "z" "e"
> a.and.c.IV
[1] "b"
MRE示例:
structure(list(id = c("3", "3", "6", "6", "7", "7"), sub1 = c("a",
"a", "a", "a", "a", "a"), sub2 = c("a", "a", "b", "b", "c", "c"
), IV = c("p", "f", "z", "e", "b", "b")), row.names = c(NA, -6L
), class = c("tbl_df", "tbl", "data.frame"))
也許split
> split(df$IV, df[c("sub1","sub2")])
$a.a
[1] "p" "f"
$a.b
[1] "z" "e"
$a.c
[1] "b" "b"
一種可能是:
a.and.a.IV<-unique(df[which(df$sub1 == "a" & df$sub2=="a"),]$IV)
a.and.b.IV<-unique(df[which(df$sub1 == "a" & df$sub2=="b"),]$IV)
a.and.c.IV<-unique(df[which(df$sub1 == "a" & df$sub2=="c"),]$IV)
> a.and.a.IV
[1] "p" "f"
> a.and.b.IV
[1] "z" "e"
> a.and.c.IV
[1] "b"
我使用@ThomasIsCoding 的評論來搜索更多解決方案。 我找到了 3 個解決方案將 dataframe 拆分為小標題列表和 1 個解決方案,使用循環將列表拆分為數據幀。 對於每個解決方案, for 循環都保持不變:
解決方案 1:使用@romainfrancois定制的 function 使用 sub1 和 sub2 的相應組合拆分和命名 data.frames。
library(dplyr, warn.conflicts = FALSE)
named_group_split <- function(.tbl, ...) {
grouped <- group_by(.tbl, ...)
names <- rlang::eval_bare(rlang::expr(paste(!!!group_keys(grouped), sep = " / ")))
grouped %>%
group_split() %>%
rlang::set_names(names)
}
df_split1 <- df %>%
named_group_split(sub1, sub2) %>%
unique()
for(i in 1:length(df_split1)) {
assign(paste0(names(df_split1[i])), as.data.frame(df_split1[[i]]))
}
解決方案 2:使用dplyr::group_split
將數據集拆分為包含所有原始變量及其各自名稱的列表。 不幸的是,此解決方案無法命名 data.frames。 解決方案在這里找到。
df_split2 <- df %>%
group_split(sub1, sub2)
for(i in 1:length(df_split2)) {
assign(paste0(names(df_split2[i])), as.data.frame(df_split2[[i]]))
}
解決方案 3:使用base::split
允許將數據集拆分為僅包含 IV 作為變量和for loop
的列表。
df_split3 <- split(df$IV, df[c("sub1","sub2")])
for(i in 1:length(df_split3)) {
assign(paste0(names(df_split3[i])), as.data.frame(df_split3[[i]]))
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.