R 基于公共值拆分列表

R 基于公共值拆分列表,r,R,我有一个包含数百个项目的列表,每个项目有两个值,如下所示: x <- list(c(123, 4), c(456, 4), c(124, 3), c(157, 3), c(123, 3), c(456, 3)) [[1]] [1] 123 4 [[2]] [1] 456 4 [[3]] [1] 124 3 [[4]] [1] 157 3 [[5]] [1] 123 3 [[6]] [1] 456 3 2) 根据第一个值将其合并到较短的列表中,给出: &

我有一个包含数百个项目的列表,每个项目有两个值,如下所示:

x <- list(c(123, 4), c(456, 4), c(124, 3), c(157, 3), c(123, 3), c(456, 3))

[[1]]
[1] 123   4

[[2]]
[1] 456   4

[[3]]
[1] 124   3

[[4]]
[1] 157   3

[[5]]
[1] 123   3

[[6]]
[1] 456   3
2) 根据第一个值将其合并到较短的列表中,给出:

> x1
[[1]]
[1] 123   4

[[2]]
[1] 456   4

> x2
[[1]]
[1] 124   3

[[2]]
[1] 157   3

[[3]]
[1] 456   3

[[4]]
[1] 123   3
> x3
[[1]]
[1] 123   3   4

[[2]]
[1] 456   3   4

[[3]]
[1] 124   3

[[4]]
[1] 157   3
我还不知道如何做第二件事,第一件事我想我已经知道了,但它不起作用:

y <- list()
for (i in 1:length(x)) {
  if(unique(x[[i]][2])){
# if(x[[i]][2] == 4){
    y[[length(y)+1]] <- x[[i]] }}

y我建议将数据整形为data.frame(或tidyverse tible)

在此基础上,可能需要重新考虑“单独列表”的需要,等等。例如,
groupby()
强制分组,以及
summary()
形成包含第二个元素列表的列

tbl %>% group_by(first) %>% summarize(values=list(second))

。。。但是,
summary()
语句创建的列表列现在可能在后续工作流程中是多余的?例如,按组计算的计数和平均数是汇总(n=n(),平均数=mean(秒))

我建议将您的数据形成一个data.frame(或tidyverse tible)

在此基础上,可能需要重新考虑“单独列表”的需要,等等。例如,
groupby()
强制分组,以及
summary()
形成包含第二个元素列表的列

tbl %>% group_by(first) %>% summarize(values=list(second))
。。。但是,
summary()
语句创建的列表列现在可能在后续工作流程中是多余的?例如,组的计数和平均值是
summary(n=n(),mean=mean(second))

我想你想要这个:

x1 <- split(x, sapply(x, function(x) x[[2]]))
x1我想你想要这个:

x1 <- split(x, sapply(x, function(x) x[[2]]))
x1这里有一种使用“data.table”的方法:

下面是一种使用“data.table”的方法:


如果您想严格地将其保存在列表中,purrr非常方便:

库(purrr)
x$3:4人名单
#>..$:num[1:2]124 3
#>..$:num[1:2]157 3
#>..$:num[1:2]123 3
#>..$:num[1:2]456 3
#>$4:2人名单
#>..$:num[1:2]123 4
#>..$:num[1:2]456 4
x2%
拆分(map_dbl(,1))%>%
修改深度(2,~.x[-1])%>%
简化所有内容()%>%
imap(~c(作为.integer(.y),.x))
str(x2)
#>4人名单
#>$123:num[1:3]12343
#>$124:num[1:2]124 3
#>$157:num[1:2]157 3
#>$456:num[1:3]4564 3
可能更有用的是,purrr可以快速将列表转换为整洁的数据框架,以便您可以通过分组操作执行这些任务:

df_x%map_dfr(~list(x=.x[1],y=.x[2]))
#或同等但更具纲领性的,
df_x%map_dfr(组合(as.list,set_名称),c('x','y'))
df_x
#>#tibble:6 x 2
#>xy
#>    
#> 1   123  4.00
#> 2   456  4.00
#> 3   124  3.00
#> 4   157  3.00
#> 5   123  3.00
#> 6   456  3.00

通过
dplyr::group_by
summary
tidyr::nest
或您拥有的任何工具。

如果您想严格地将其保存在列表中,purrr很方便:

库(purrr)
x$3:4人名单
#>..$:num[1:2]124 3
#>..$:num[1:2]157 3
#>..$:num[1:2]123 3
#>..$:num[1:2]456 3
#>$4:2人名单
#>..$:num[1:2]123 4
#>..$:num[1:2]456 4
x2%
拆分(map_dbl(,1))%>%
修改深度(2,~.x[-1])%>%
简化所有内容()%>%
imap(~c(作为.integer(.y),.x))
str(x2)
#>4人名单
#>$123:num[1:3]12343
#>$124:num[1:2]124 3
#>$157:num[1:2]157 3
#>$456:num[1:3]4564 3
可能更有用的是,purrr可以快速将列表转换为整洁的数据框架,以便您可以通过分组操作执行这些任务:

df_x%map_dfr(~list(x=.x[1],y=.x[2]))
#或同等但更具纲领性的,
df_x%map_dfr(组合(as.list,set_名称),c('x','y'))
df_x
#>#tibble:6 x 2
#>xy
#>    
#> 1   123  4.00
#> 2   456  4.00
#> 3   124  3.00
#> 4   157  3.00
#> 5   123  3.00
#> 6   456  3.00

通过
dplyr::group_by
summary
tidyr::nest
或您拥有的任何工具。

为什么不使用
data.frame
?数据是从一些igraph函数输出的,并且……假设它不支持数据帧的概念。但是我确实花了相当多的时间试图看看我是否可以使用数据帧而不是列表,这是不可能的。对于你的第一个任务,
split(x,sapply(x,`[`,2))
你真的需要“x1”和“x2”吗?或者这些仅仅是为了帮助你获得“x3”@ec1013如果它是igraph的输出,我假设它是一个图形(定向的还是非定向的),为什么不使用图形控件,而不是在外部完成所有工作?(我们需要一个可复制的代码来回答这种输出)你为什么不直接使用一个
data.frame
?数据是从一些igraph函数输出的,并且…让我们说它不符合数据帧的概念。但是我确实花了相当多的时间试图看看我是否可以使用数据帧而不是列表,这是不可能的。对于你的第一个任务,
split(x,sapply(x,`[`,2))
你真的需要“x1”和“x2”吗?或者这些仅仅是为了帮助你达到“x3”@ec1013如果它是一个来自igraph的输出,我假设它是一个图形(有向或无向),为什么不使用图形控件而不是在外部完成所有工作?(我们需要一个可复制的代码来给出这种输出的答案)
tbl=tible(elt=elt,first=first,second=second)
返回一个错误:错误:列
first
second
的长度必须是1或12,而不是6,6你能解释一下
'[['
在vapply中的作用吗?对于向量
x=c(1,2,3)
x[/code>提取第一个元素。因此
vapply()
遍历列表x的元素,对于第i个元素,它提取第一个(
[,…,1
)或第二个(
[,…,2
)元素;它类似于@minem的函数,
vapply(x,函数(x)x[[1]],数值(1))
,但写为
vapply(x,函数(x,i)x[[i]],数值(1),1)
然后,因为
[[
实际上是一个函数(请参见
get([[”
),用
vapply(x,
[
,numeric(1),1)
)替换函数调用a-function。要获得某种类似的结果,可以执行
x2%do.call(rbind,)%%>%as\u tibble%>%ne
library(data.table)
data.table(do.call(rbind, x))[, list(new = list(c(V1, V2))), V1]$new
## [[1]]
## [1] 123   4   3
## 
## [[2]]
## [1] 456   4   3
## 
## [[3]]
## [1] 124   3
## 
## [[4]]
## [1] 157   3
##