我正在寻找一种基于向量中命名属性拆分向量列表的方法。 假设我有一个带有向量的命名列表:
> 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个可能的值。
答案 0 :(得分:3)
使用split
和sapply
的解决方案。
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 #