簡體   English   中英

為數據集中兩個變量的每個組合保存變量的唯一值

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM