Разделить список векторов на основе именованного атрибута в векторе - PullRequest
0 голосов
/ 21 февраля 2019

Я ищу способ разбить список векторов на основе именованного атрибута в векторе.Предположим, у меня есть именованный список с векторами:

> 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 списка:

  • 1-й список будет содержать все векторы, которые имеют col2 = a
  • 2-й список будет содержать все векторы, которые имеют 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.

Ответы [ 2 ]

0 голосов
/ 21 февраля 2019

Решение с использованием 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"  "#" 
0 голосов
/ 21 февраля 2019

Вы можете 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    #
...