gpt4 book ai didi

r - 从列表元素的成对组合构建数据框

转载 作者:行者123 更新时间:2023-12-02 06:46:38 25 4
gpt4 key购买 nike

我有一个列表 list。此列表的前 5 个元素是:

[[1]]
[1] "#solarpanels" "#solar"

[[2]]
[1] "#Nuclear" "#Wind" "#solar"

[[3]]
[1] "#solar"

[[4]]
[1] "#steel" "#windenergy" "#solarenergy" "#carbonfootprint"

[[5]]
[1] "#solar" "#wind"

我想删除像 [[3]] 这样的元素,因为它只包含一个元素。此外,我想构建一个数据框,其中包含列表每一行的所有可能组合。例如,具有两列的数据框(例如,第一列命名为 A,第二列命名为 B),例如:

A                  B
"#solarpanels" "#solar"
"#Nuclear" "#Wind"
"#Nuclear" "#solar"
"#steel" "#windenergy"
"#steel" "#solarenergy"
"#steel" "#carbonfootprint"
"#windenergy" "#carbonfootprint"
"#windenergy" "#solarenergy"
"#solarenergy" "#carbonfootprint"
"#solar" "#wind"

我试过(只针对一个元素)

for (i in 1:(length(list[[4]])-1)) {
df$from = rep(list[[4]][i],length(list[[4]])-i)
df$to = list[[4]][(i+1):length(list[[4]])]
}

在哪里

df=data.frame(A=character(), 
B=character(),
stringsAsFactors=FALSE)

但是我得到了

data.frame`(`*tmp*`, A, value = c("#steel", "#steel",  : 
replacement has 3 rows, data has 0

对于 i=1

最佳答案

首先是您的数据:

l = list(
c("#solarpanels", "#solar"),
c("#Nuclear", "#Wind", "#solar"),
"#solar",
c("#steel", "#windenergy", "#solarenergy", "#carbonfootprint"),
c("#solar", "#wind")
)

这是一个两行版本:

l = l[lengths(l) > 1L]
data.frame(do.call(rbind, unlist(lapply(l, combn, 2L, simplify = FALSE), recursive = FALSE)))
# X1 X2
# 1 #solarpanels #solar
# 2 #Nuclear #Wind
# 3 #Nuclear #solar
# 4 #Wind #solar
# 5 #steel #windenergy
# 6 #steel #solarenergy
# 7 #steel #carbonfootprint
# 8 #windenergy #solarenergy
# 9 #windenergy #carbonfootprint
# 10 #solarenergy #carbonfootprint
# 11 #solar #wind

为了清晰起见,更慢一些:

combn(x, k)x 返回大小为 k 的所有可能(无序)子集;您所追求的是列表中每个元素的对。默认情况下,它以 matrix 的形式返回 p = choose(length(x), k) 列,但这对您的用例来说不是有用的格式; simplify = FALSE 将每个子集作为 list 的新元素返回。

所以 lapply(l, combn, 2L, simplify = FALSE) 看起来像这样:

# [[1]]
# [[1]][[1]]
# [1] "#solarpanels" "#solar"
#
#
# [[2]]
# [[2]][[1]]
# [1] "#Nuclear" "#Wind"
#
# [[2]][[2]]
# [1] "#Nuclear" "#solar"

(我们必须首先过滤 l 的长度为 1 的元素,因为从长度为 1 的对象中请求 2 元素是错误的,因此第一个线)

lapply(.) 位是问题的症结所在;剩下的只是将输出(已经具有所有正确的数据)拼凑成 data.frame 格式。

首先,lapply 输出是嵌套的——它是 listlist。有一个长度为 2 的向量的 list 更统一; unlist(., recusive=FALSE) 通过取消第一级列表的嵌套来实现这一点(使用 recursive=TRUE,我们将得到一个大的长向量并且失去配对结构;我们可以使用它,但我认为可能有点不自然)。

接下来,我们将长度为 2 的向量列表转换为矩阵(着眼于最终目标——2 列矩阵很容易转换为 data.frame) ; list-matrixbase 中用 do.call(rbind, .) 完成。

最后我们将它传递给 data.frame瞧瞧!

data.table 中,我会在一个命令中稍微更干净地完成它:

setDT(transpose(
unlist(lapply(l[lengths(l) > 1L], combn, 2L, simplify = FALSE), recursive = FALSE)
))[]

鉴于您可能不太关心中间输出,这也是使用 magrittr 的好地方:

library(magrittr)
l[lengths(l) > 1L] %>%
lapply(combn, 2L, simplify = FALSE) %>%
unlist(recursive = FALSE) %>%
do.call(rbind, . ) %>%
data.frame

它更具可读性,但在这种情况下,很高兴看到 data.frame 是预先的最终目标,因为 unlist 的意图& do.call 步骤可能不那么晦涩。

关于r - 从列表元素的成对组合构建数据框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59693113/

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