我有一个清单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)
返回大小的每一个可能的(无序的)子集k
从x
; 您所追求的是列表中每个元素的配对。默认情况下,它以matrix
withp = choose(length(x), k)
列的形式返回它,但这对您的用例而言不是有用的格式;simplify = FALSE
返回每个子集作为a的新元素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
first的length-1元素,因为2
从length-1对象(因此第一行)中请求元素是错误的)
这lapply(.)
是您问题的症结所在;其余的只是将输出(已经具有所有正确的数据)混合成一种data.frame
格式。
首先,lapply
输出是嵌套的-list
是list
的。具有list
长度为2的向量更均匀。unlist(., recusive=FALSE)
通过取消嵌套列表的第一层来实现此目的(使用recursive=TRUE
,我们会得到一个很大的长向量并失去配对的结构;我们可以使用它,但我认为可能有点不自然)。
接下来,我们将长度为2的向量列表转换为矩阵(着眼于最终目标-2列矩阵很容易转换为data.frame
);list
- >matrix
在完成base
与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
步骤的意图可能会晦涩。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句