Разделить Dataframe на список однорядных Dataframe - PullRequest
1 голос
/ 14 февраля 2020

Я хотел бы разбить фрейм данных

df <- data.frame(a = 1:4, b = letters[1:4])

  a b
1 1 a
2 2 b
3 3 c
4 4 d

на список однорядных фреймов данных

list(
    data.frame(a = 1, b = letters[1])
    , data.frame(a = 2, b = letters[2])
    , data.frame(a = 3, b = letters[3])
    , data.frame(a = 4, b = letters[4])
)

[[1]]
  a b
1 1 a

[[2]]
  a b
1 2 b

[[3]]
  a b
1 3 c

[[4]]
  a b
1 4 d

Есть ли элегантное решение для этого?

Ответы [ 3 ]

3 голосов
/ 14 февраля 2020

Использование dplyr:

df %>%
 rowid_to_column() %>%
 group_split(rowid, keep = FALSE) 

[[1]]
# A tibble: 1 x 2
      a b    
  <int> <fct>
1     1 a    

[[2]]
# A tibble: 1 x 2
      a b    
  <int> <fct>
1     2 b    

[[3]]
# A tibble: 1 x 2
      a b    
  <int> <fct>
1     3 c    

[[4]]
# A tibble: 1 x 2
      a b    
  <int> <fct>
1     4 d    

Или:

df %>%
 mutate(rowid = 1:n()) %>%
 group_split(rowid, keep = FALSE) 

Или сокращенная версия (предоставляется @ arg0naut91):

group_split(df, row_number(), keep = FALSE)
3 голосов
/ 14 февраля 2020

Простой способ - использовать команду split(), встроенную в R

split( df, 1:length( df$a ) )

. Она должна быть достаточно надежной для обработки дубликатов в df$a.

2 голосов
/ 14 февраля 2020

Это было бы с asplit

lapply(asplit(df, 1), as.data.frame.list)
#[[1]]
#  a b
#1 1 a

#[[2]]
#  a b
#1 2 b

#[[3]]
#  a b
#1 3 c

#[[4]]
#  a b
#1 4 d

Или с pmap

library(purrr)
pmap(df, tibble)
#[[1]]
# A tibble: 1 x 2
#      a b    
#  <int> <fct>
#1     1 a    

#[[2]]
# A tibble: 1 x 2
#      a b    
#  <int> <fct>
#1     2 b    

#[[3]]
# A tibble: 1 x 2
#      a b    
#  <int> <fct>
#1     3 c    

#[[4]]
# A tibble: 1 x 2
#      a b    
#  <int> <fct>
#1     4 d    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...