#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)