gpt4 book ai didi

r - 获取特定列的所有可能组合,同时保留其他列

转载 作者:行者123 更新时间:2023-12-04 15:23:42 27 4
gpt4 key购买 nike

我有一个包含 FTA 数据的数据框。 c1 到 c91 表示自由贸易协定的不同国家部分。我想找到从 c1 到 c91 的所有可能的国家成对组合,同时保留否、基本条约和条目类型列。

FTA 数据示例

No   Base_treaty   entry_type              c1           c2         c3
3 3 treaty Algeria Angola Benin
5 5 treaty Albania Bulgaria NA
6 6 treaty Albania Croatia NA

期望的输出:

No   Base_treaty   entry_type              ctry1       ctry2        
3 3 treaty Algeria Angola
3 3 treaty Algeria Benin
3 3 treaty Benin Angola
5 5 treaty Albania Bulgaria
5 5 treaty Albania NA
5 5 treaty Bulgaria NA
6 6 treaty Albania Croatia

到目前为止我做了什么:

df <- do.call(rbind, lapply(seq_along(cols), function(i) t(combn(output[i,4:6],2))))其中输出是我的 FTA 数据。虽然这能够为我提供跨“c”列的成对组合,但我无法将“No”、“Base_treaty”和“entry_type”复制到每一对。

它只给我这个:

        [,1]      [,2]           
[1,] "Algeria" "Angola"
[2,] "Algeria" "Benin"
[3,] "Benin" "Angola"
[4,] "Albania" "Bulgaria"
[5,] "Albania" "NA"
[6,] "Bulgaria" "NA"
.
.

.

如有任何帮助,我们将不胜感激!

最佳答案

你很接近。我将列号作为一个函数放在 combn 中,我们可以在其中 cbind 稳定列与组合。要查找国家/地区列的数量,我们可以使用带有正则表达式的 grep

do.call(rbind, combn(grep("^c\\d+$", names(output)), 2, function(x) 
cbind(output[1:3], setNames(output[x], paste0("c", 1:2))), simplify=F))
# No Base_treaty entry_type c1 c2
# 1 3 3 treaty Algeria Angola
# 2 5 5 treaty Albania Bulgaria
# 3 6 6 treaty Albania Croatia
# 4 3 3 treaty Algeria Benin
# 5 5 5 treaty Albania <NA>
# 6 6 6 treaty Albania <NA>
# 7 3 3 treaty Angola Benin
# 8 5 5 treaty Bulgaria <NA>
# 9 6 6 treaty Croatia <NA>

正则表达式 "^c\\d+$":

  • ^ 字符串开始
  • c 字面匹配 "c"
  • \\d+一个或多个数字
  • $ 字符串结尾

数据:

output <- structure(list(No = c(3L, 5L, 6L), Base_treaty = c(3L, 5L, 6L
), entry_type = c("treaty", "treaty", "treaty"), c1 = c("Algeria",
"Albania", "Albania"), c2 = c("Angola", "Bulgaria", "Croatia"
), c3 = c("Benin", NA, NA)), class = "data.frame", row.names = c(NA,
-3L))

关于r - 获取特定列的所有可能组合,同时保留其他列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62771516/

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