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

标记

我有一个清单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)返回大小的每一个可能的(无序的)子集kx; 您所追求的是列表中每个元素的配对。默认情况下,它以matrixwithp = 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"  

(我们必须过滤lfirst的length-1元素,因为2从length-1对象(因此第一行)中请求元素是错误的

lapply(.)是您问题的症结所在;其余的只是将输出(已经具有所有正确的数据)混合成一种data.frame格式。

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

接下来,我们将长度为2的向量列表转换为矩阵(着眼于最终目标-2列矩阵很容易转换为data.frame);list- >matrix在完成basedo.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预先的最终目标,否则unlistdo.call步骤的意图可能会晦涩。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

按列名称组合列表元素以创建数据框

来自分类Dev

按列名称组合列表元素以创建数据框

来自分类Dev

成对组合任意列表

来自分类Dev

如何从水平的成对组合生成数据框

来自分类Dev

从列表逐行构建数据框

来自分类Dev

在python中组合元组数据框列表

来自分类Dev

从字典列表中获取组合的数据框

来自分类Dev

从vaadin的组合框列表中获取数据

来自分类Dev

从列表中选择多个元素以构建数据框的最快方法

来自分类Dev

通过汇总列表来构建数据框

来自分类Dev

通过汇总列表来构建数据框

来自分类Dev

将函数应用于R中列表元素的所有成对组合

来自分类Dev

R-两个列表中元素的所有成对组合

来自分类Dev

Java:成对组合数组中的元素

来自分类Dev

安排数据框以成对相关

来自分类Dev

提取列表中列表以在 R 中构建数据框

来自分类Dev

访问列表中数据框的元素?

来自分类Dev

R:使用元素作为数据框的列表

来自分类Dev

熊猫数据框元素与值列表的比较

来自分类Dev

将组合框元素绑定到数据源

来自分类Dev

将组合框元素绑定到数据源

来自分类Dev

填充组合框列表

来自分类Dev

带有WCF服务列表的数据绑定组合框

来自分类Dev

根据组合为列表中的数据框分配名称

来自分类Dev

如何从列表列创建组合的Pyspark数据框

来自分类Dev

在列表内组合向量以创建数据框R

来自分类Dev

从数据框中的产品列表创建配对组合

来自分类Dev

C# 返回组合框中的数据库列表

来自分类Dev

Excel VBA 用组合框替换数据验证列表