繁体   English   中英

根据向量中的命名属性拆分向量列表

[英]Split a list of vectors based on named attribute in vector

我正在寻找一种基于矢量中的命名属性来分割矢量列表的方法。 假设我有一个带矢量的命名列表:

> v <- list("1"=c(col1=1, col2="a", col3="!"), "2"=c(col1=2, col2="b", col3="@"), "3"=c(col1=3, col2="b", col3="#"), "4"=c(col1=4, col2="a", col3="$"))
> v
$`1`
col1 col2 col3 
 "1"  "a"  "!" 

$`2`
col1 col2 col3 
 "2"  "b"  "@" 

$`3`
col1 col2 col3 
 "3"  "b"  "#" 

$`4`
col1 col2 col3 
 "4"  "a"  "$" 

我想基于col2的值拆分出来,所以在这个例子中我希望有2个列表:

  • 第一个列表将包含col2 = a所有向量
  • 第二个列表将包含col2 = b所有向量。

我正在寻找类似于以下的输出:

对于col2 = a

$`1`
col1 col2 col3 
 "1"  "a"  "!" 
$`4`
col1 col2 col3 
 "4"  "a"  "$" 

对于col2 = b

$`2`
col1 col2 col3 
 "2"  "b"  "@" 

$`3`
col1 col2 col3 
 "3"  "b"  "#" 

注意 :我更喜欢一个更通用的解决方案,按col2分组,但二进制解决方案可以,因为在这个特定的应用程序中,我只有2个可能的col2值。

使用splitsapply解决方案。

split(v, sapply(v, function(x) x[["col2"]]))
# $a
# $a$`1`
# col1 col2 col3 
# "1"  "a"  "!" 
# 
# $a$`4`
# col1 col2 col3 
# "4"  "a"  "$" 
# 
# 
# $b
# $b$`2`
# col1 col2 col3 
# "2"  "b"  "@" 
# 
# $b$`3`
# col1 col2 col3 
# "3"  "b"  "#" 

您可以rbind第一,即

d1 <- data.frame(do.call(rbind, v))
split(d1, d1$col2)

这使,

 $`a` col1 col2 col3 1 1 a ! 4 4 a $ $b col1 col2 col3 2 2 b @ 3 3 b # 

如果你想在每一行重新拆分,那么你可以这样做,

lapply(split(d1, d1$col2), function(i)split(i, seq(nrow(i))))

这使,

 $`a` $`a`$`1` col1 col2 col3 1 1 a ! $`a`$`2` col1 col2 col3 4 4 a $ $b $b$`1` col1 col2 col3 2 2 b @ $b$`2` col1 col2 col3 3 3 b # 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM