gpt4 book ai didi

R 脚本生成两个相同列表的所有组合,包括不完整列表

转载 作者:行者123 更新时间:2023-12-03 21:40:50 24 4
gpt4 key购买 nike

我认为这个问题可以通过许多不同的方式解决,但我基本上想找到一个函数,它会给我一个数据框,其中包含列表中值的每个组合到其列中,包括不完整的集合并排除一些,但不是全部,冗余组合(顺序现在不重要)。
所以我可能会从这样的列表开始:

 List = c("A","B","C") 
我想得到一个看起来像的数据框
C1 = c("A","B","C","A","A","B","A")
C2 = c("","","","B","C","C","B")
C3 = c("","","","","","","C")
df <- cbind(C1, C2, C3)
row.names(df) <- c("A", "B", "C", "AB", "AC", "BC", "ABC")
colnames(df) <- c("First_Item", "Second_Item","Third_Item")
然后它用相应的字母填充每个单元格。
例如df 中的位置 A1 将是“A”,位置 A2 和 A3 将是空的。
知道怎么做吗?
我试过 dplyr:
library(tidyr)
list_1 = c("A", "B", "C", "NA")
list_2 = c("A", "B", "C", "NA")
list_3 = c("A", "B", "C", "NA")
list_4 = c("A", "B", "C", "NA")
test <- crossing(list_1, list_2,list_3,list_4)
test <- test[apply(test, MARGIN = 1, FUN = function(x) !(duplicated(x) | !any = "NA")),]
但是我想保留其中包含多个 NA 的所有值,所以这不太有效。
expand.grid 有同样的问题
expand.grid(list_1 = c("A", "B", "C", "NA"),list_2 = c("A", "B", "C", "NA"),list_3 = c("A", "B", "C", "NA"),list_4 = c("A", "B", "C", "NA"))
编辑
我最终使用了两个答案的组合!感谢你的帮助。
List = c("A","B","C") 
df <- seq_along(List)%>%
lapply(combn, x = List, simplify = FALSE) %>%
unlist(recursive = FALSE) %>%
sapply(`length<-`, length(List)) %>%
t() %>%
data.frame()
rownames_df <- seq_along(List) %>% map(~ apply(combn(List, m = .x), 2, paste, collapse = "/")) %>% unlist(recursive = FALSE)
row.names(df) <- rownames_df

最佳答案

这基本上是 Roland's answer (所以请赞成他的回答):

library(magrittr) # just for the pipe-operator

List %>%
seq_along() %>%
lapply(combn, x = List, simplify = FALSE) %>%
unlist(recursive = FALSE) %>%
sapply(`length<-`, length(List)) %>%
t() %>%
data.frame()
返回
  X1   X2   X3
1 A <NA> <NA>
2 B <NA> <NA>
3 C <NA> <NA>
4 A B <NA>
5 A C <NA>
6 B C <NA>
7 A B C
此外,您可以使用 dplyrtidyr要替换的软件包 NA s。只需在管道中再添加一个函数:
mutate(across(everything(), replace_na, ""))

关于R 脚本生成两个相同列表的所有组合,包括不完整列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67912722/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com