Из приведенных выше ответов, AK запустить и Колин работал.

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

airquality <- data.frame(City = c("CityA", "CityA","CityA",
                                  "CityB","CityB","CityB",
                                  "CityC", "CityC"),
                         year = c("1990", "2000", "2010", "1990", 
                                  "2000", "2010", "2000", "2010"),
                         month = c("June", "July", "August",
                                   "June", "July", "August",
                                   "June", "August"),
                         PM10 = c(runif(3), rnorm(5)),
                         PM25 = c(runif(3), rnorm(5)),
                         Ozone = c(runif(3), rnorm(5)),
                         CO2 = c(runif(3), rnorm(5)))
airquality

Итак, я получаю список имен с номером, чтобы я знал, какие столбцы выбрать:

nam<-names(airquality)
namelist <- data.frame(matrix(t(nam)));namelist

Я хочу рассчитать среднее значение по городу и году для PM25, озона и CO2. Это означает, что мне нужны столбцы 1,2,4,6: 7)

acast(datadf, year ~ city, mean, na.rm=TRUE)

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

Есть ли способ лучше?

 akrun20 сент. 2017 г., 21:32
возможноlibrary(dplyr); airquality %>% group_by(City, year) %>% summarise_at(vars("PM25", "Ozone", "CO2"), mean)

Ответы на вопрос(4)

Ты должен попытатьсяdplyr::mutate_at :

library(dplyr)
airquality %>%
  group_by(City, year) %>%
  summarise_at(.vars = c("PM10", "PM25", "Ozone", "CO2"), .funs = mean)

# A tibble: 8 x 6
# Groups:   City [?]
    City   year         PM10       PM25      Ozone         CO2
  <fctr> <fctr>        <dbl>      <dbl>      <dbl>       <dbl>
1  CityA   1990  0.004087379  0.5146409 0.44393422  0.61196671
2  CityA   2000  0.039414194  0.8865582 0.06754322  0.69870187
3  CityA   2010  0.116901563  0.6608619 0.51499227  0.32952099
4  CityB   1990 -1.535888778 -0.9601897 1.17183649  0.08380664
5  CityB   2000  0.226046487  0.4037230 0.86554997 -0.05698204
6  CityB   2010 -0.824719956  0.1508471 0.32089806 -0.12871853
7  CityC   2000 -0.824509111 -0.6928741 0.85553837  0.12137923
8  CityC   2010 -1.626150294  1.5176198 0.21183149 -0.63859910

исходному набору данных, потому что хотел вычислить среднее по городам и годам. Вот обновленный набор данных

airquality <- data.frame(City = c("CityA", "CityA","CityA","CityA",
                              "CityB","CityB","CityB","CityB",
                              "CityC", "CityC", "CityC"),
                     year = c("1990", "2000", "2010", "2010", 
                              "1990", "2000", "2010", "2010",   
                              "1990", "2000", "2000"),
                              month = c("June", "July", "August", "August",
                              "June", "July", "August","August",
                              "June", "August", "August"),
                              PM10 = c(runif(6), rnorm(5)),
                              PM25 = c(runif(6), rnorm(5)),
                              Ozone = c(runif(6), rnorm(5)),
                              CO2 = c(runif(6), rnorm(5)))
                              airquality

Из приведенных выше ответов, AK запустить и Колин работал.

Решение Вопроса

Мы можем использоватьdplyr с участиемsummarise_at получитьmean соответствующих столбцов после группировки по интересующему столбцу

library(dplyr)
airquality %>%
   group_by(City, year) %>% 
   summarise_at(vars("PM25", "Ozone", "CO2"), mean)
 Jen21 сент. 2017 г., 23:57
Поэтому я проверил предложенные ответы, добавив 2 точки данных для города А в 2010 году и две точки данных для города С в 2000 году.

summarise_at Решение Колина самое простое, но, конечно, есть несколько. Вот еще одно решение, используяtidyr переставить и рассчитать среднее:

  select(City, year, PM25, Ozone, CO2) %>% 
  gather(var, value, -City, -year) %>%
  group_by(City, year, var) %>% 
  summarise(avg = mean(value, na.rm=T)) %>% # can stop here if you want
  spread(var, avg) # optional to make this into a wider table
# A tibble: 8 x 5
# Groups:   City, year [8]
    City   year          CO2       Ozone         PM25
* <fctr> <fctr>        <dbl>       <dbl>        <dbl>
1  CityA   1990  0.275981522  0.19941717  0.826008441
2  CityA   2000  0.090342153  0.50949094  0.005052771
3  CityA   2010  0.007345704  0.21893117  0.625373926
4  CityB   1990  1.148717447 -1.05983482 -0.961916973
5  CityB   2000 -2.334429324  0.28301220 -0.828515418
6  CityB   2010  1.110398814 -0.56434523 -0.804353609
7  CityC   2000 -0.676236740  0.20661529 -0.696816058
8  CityC   2010  0.229428142  0.06202997 -1.396357288

Ваш ответ на вопрос