Разделить фрейм данных на список и удалить индекс

#r

#r

Вопрос:

Я хочу разделить фрейм данных на список на основе индекса, но в список я не хочу включать индекс.

Например, я хочу разделить фрейм данных в данных mtcars на основе mpg.

 data(mtcars)
lst <- split(mtcars, mtcars$mpg)
  

lst В каждом элементе все еще есть mpg. Я надеюсь, что не буду включать mpg. Есть ли какой-нибудь простой способ добиться этого? Спасибо.

Комментарии:

1. unname(split(mtcars, mtcars$mpg))

2. lst <- split(mtcars, mtcars$mpg); lst <- lapply(lst, function(x) x[, -1]) тоже работает.

Ответ №1:

Мы можем использовать group_split from dplyr , у которого есть keep параметр, который принимает логическое значение, чтобы либо сохранить столбец, либо нет

 library(dplyr)
mtcars %>% 
    group_split(mpg, keep = FALSE)
  

С помощью base R столбец может быть удален с помощью setdiff

 split(mtcars[setdiff(names(mtcars), "mpg")], mtcars$mpg)
  

Комментарии:

1. Если я выполню этот код: car <- unname(split(mtcars, mtcars $ mpg, drop = TRUE)) у car [[1]] все еще есть mpg в виде столбца.

2. @Roger Извините, я думал, вы хотите удалить имена. Обновил сообщение

Ответ №2:

Это достойный вариант использования для часто забытого plyr пакета. Я просто использовал три верхние строки mtcars для иллюстрации:

 library(plyr)
dlply(head(mtcars,3), "mpg", function(x) x[, -1])
#> $`21`
#>   cyl disp  hp drat    wt  qsec vs am gear carb
#> 1   6  160 110  3.9 2.620 16.46  0  1    4    4
#> 2   6  160 110  3.9 2.875 17.02  0  1    4    4
#> 
#> $`22.8`
#>   cyl disp hp drat   wt  qsec vs am gear carb
#> 1   4  108 93 3.85 2.32 18.61  1  1    4    1
#> 
#> attr(,"split_type")
#> [1] "data.frame"
#> attr(,"split_labels")
#>    mpg
#> 1 21.0
#> 2 22.8
  

Создано 2019-04-01 пакетом reprex (версия 0.2.1)