![](/img/trans.png)
[英]How to split a list of vectors into sublist based on a values of another vector in r
[英]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值。
使用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" "#"
您可以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.