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

时间:2019-02-21 14:50:59

标签: r list split

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

> 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进行分组的更通用的解决方案,但可以采用二进制解决方案,因为在此特定应用程序中,col2仅具有2个可能的值。

2 个答案:

答案 0 :(得分:3)

使用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"  "#" 

答案 1 :(得分:2)

您可以首先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    #