Ошибка цикла в R для построения таблиц - PullRequest
0 голосов
/ 11 мая 2018

Я пытаюсь создать 3 кадра данных, используя цикл в R, код такой: В идеале я хотел бы иметь dfmean, dfmedian, dfsum.

 list<- c("mean","sum","median")

 for (i in list) {
   df[[i]]<-df%>%
   group_by(Year)%>%
   summarise_if(is.numeric, i , na.rm = TRUE) 
   }

Я получаю следующую ошибку: Ошибка в [[<-.data.frame (*tmp*, i, значение = список (Год = 1:10,

Ответы [ 3 ]

0 голосов
/ 11 мая 2018

Похоже, что вы работаете в tidyverse, используйте purrr::map, чтобы применить несколько функций суммирования:

require(tidyverse)

operations <- c("mean", "sum", "median")

dfs <- operations %>%
  map(~ df %>%
        group_by(Year) %>%
        summarise_if(is.numeric, .x, na.rm=TRUE))

> class(dfs)
[1] "list"

> dfs[[1]]
# A tibble: 3 x 3
   Year     a      b
  <int> <dbl>  <dbl>
1  2001 0.250 0.0600
2  2002 0.201 0.0686
3  2004 0.253 0.0222

Данные

n <- 100
df <- data.frame(Year=sample(2001:2005, replace = TRUE), 
                 a=rnorm(n), 
                 b=rnorm(n))

> df %>% head()
  Year            a           b
1 2001 -0.002929493 -0.29111621
2 2001  1.590653841 -0.39661866
3 2002  1.041438363 -0.62323955
4 2004  1.854152790 -0.06730789
5 2002  0.396443422  0.66564886
6 2001  0.174203172  0.83243156
0 голосов
/ 11 мая 2018

Вы можете избежать цикла при использовании dplyr.Вы можете просто переписать свой summarise_if как:

library(dplyr)

list<- c("mean","sum","median")

df %>% group_by(Year) %>% 
  summarise_if(is.numeric, .funs = list )

# The below result is from a sample data.frame used by me
#
# # A tibble: 3 x 7
#    Year A_mean B_mean A_sum B_sum A_median B_median
#   <int>  <dbl>  <dbl> <int> <int>    <dbl>    <dbl>
# 1     1   4.71   24.7    33   173     4.00     24.0
# 2     2   8.00   28.0     8    28     8.00     28.0
# 3     3   7.00   27.0    14    54     7.00     27.0

Данные:

df <- data.frame(Year = sample(1:3,10,replace = TRUE), A=1:10, B=21:30)
0 голосов
/ 11 мая 2018

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

    list<- c("mean","sum","median")

Test=list()

    for (i in list) {
       Test[[i]]<-df%>%
       group_by(Year)%>%
       summarise_if(is.numeric, i , na.rm = TRUE) 
       }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...