применить функцию ntile к списку фреймов данных с разными размерами сегментов - PullRequest
0 голосов
/ 04 мая 2020

Я хотел бы использовать функцию ntile из dplyr или аналогичную функцию в списке фреймов данных, но использовать разные n для каждого фрейма данных. Мой список содержит 150 кадров данных, поэтому ручное решение, подобное приведенному ниже, не будет работать. Как можно переписать приведенный ниже код, чтобы он действовал в списке фреймов данных и возвращал список фреймов данных с новым столбцом?

library(tidyverse)
iris_list=split(iris,iris$Species)

iris_setosa=iris_list[[1]]
iris_versicolor=iris_list[[2]]
iris_virginica=iris_list[[3]]
iris_setosa$n3=ntile(iris_setosa$Sepal.Length,3)
iris_versicolor$n5=ntile(iris_setosa$Sepal.Length,5)
iris_virginica$n7=ntile(iris_setosa$Sepal.Length,7) 

Окончательный результат должен быть следующим:

final_list=list(iris_setosa,iris_versicolor,iris_virginica)



head(final_list[[1]])
  Sepal.Length Sepal.Width Petal.Length Petal.Width Species n3
1          5.1         3.5          1.4         0.2  setosa  2
2          4.9         3.0          1.4         0.2  setosa  1
3          4.7         3.2          1.3         0.2  setosa  1
4          4.6         3.1          1.5         0.2  setosa  1
5          5.0         3.6          1.4         0.2  setosa  2
6          5.4         3.9          1.7         0.4  setosa  3

Ответы [ 2 ]

0 голосов
/ 05 мая 2020

Я нашел способ, который работает

n_size=data.frame(Species=c("setosa ","versicolor","virginica"),size=c(3,5,7))
iris_bin=iris %>% inner_join(n_size,by="Species") %>%
                  group_by(Species)%>% 
                  mutate(bin=ntile(Sepal.Length,size[1])) %>% 
                  arrange(Species,Sepal.Length,bin)
0 голосов
/ 04 мая 2020

Есть несколько способов добиться этого, в зависимости от того, какой тип объекта вы хотите получить.

Один из способов - использовать base::expand.grid и purrr::pmap, например:

percentiles = list(3,5,7)
iris_list %>% 
  map("Sepal.Length") %>% 
  expand.grid(percentiles) %>% 
  pmap(~ntile(..1,..2))

Во-первых, вам нужна только переменная Sepal.Length из всех ваших наборов данных, поэтому вы используете purrr::map для их получения.

Затем expand.grid создает фрейм данных всех комбинаций своих параметров. Здесь, с 2 списками из 3 членов, он вернул бы фрейм данных 3х3 = 9 строк: setosa 3, versicolor 3, virginica 3, setosa 5, ...

Наконец, pmap может выполнить итерации по фрейму данных и применить функцию ntile с первым столбцом (iris_list) в качестве первого аргумента и вторым столбцом (percentiles) в качестве второго аргумента. К сожалению, purrr очень плохо работает с именами, но кажется, что это нарочно.

РЕДАКТИРОВАТЬ:

Ваше редактирование как-то другой вопрос, так что вот еще один ответ:

iris_list %>%
   map(~mutate(.x, n3=ntile(Sepal.Length,3)), 
               n5=ntile(Sepal.Length,5)), n7=ntile(Sepal.Length,7)))
...