簡體   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