Применить функцию к нескольким столбцам с несколькими столбцами - PullRequest
0 голосов
/ 18 апреля 2019

В приведенных ниже данных есть значения для 2005 и 2006. Каждый год имеет 2 столбца как h1 и h24. Функция myfun использует h1 для агрегирования часовых данных в 6, 12 и 24-часовые данные как h6, h12 и h24 и находит их средства как mean1, mean6, mean12 и mean24 за каждый год отдельно и перечисляя их.

Заголовок данных:

    X2005.h1  X2005.h24   X2006.h1 X2006.h24
1        0       0.0        0       0.0
2        0       0.0        0       8.6
3        0       3.4        0      11.2
4        0      21.4        0       8.4
5        0       1.8        0       0.0
6        0       1.4        0       0.0

И все мои данные:

myd<-structure(list(X2005.h1 = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0.6, 0.2, 0, 0, 0.6, 0.2, 0.6, 0.6, 0, 0, 0, 0.6, 1.2, 1.8, 
1.8, 1.2, 1, 1.2, 1.6, 1.2, 1.4, 1, 1.2, 0.8, 0.8, 0.2, 0, 0, 
1.6, 0.4, 0, 0.4, 1.2, 0.8, 0.2, 0.4, 0.2, 0.4, 0.4, 0.2, 0.2, 
0.2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.2, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.2, 0.2, 
0.4, 0.4, 0.2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0.2, 0.4, 1.2, 1.6, 2.2, 1.8, 0.4, 0.6, 0, 
0.2, 0.2, 0, 0, 0, 0, 0, 0, 0, 0, 0.2, 0.2, 0.2, 0, 0.6, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0.4, 0.2, 0, 0, 0.8, 0, 0, 0.2, 0, 0, 0, 0, 0.2, 0.2, 0.2, 0, 
0, 1.2, 4, 0.2, 0, 0, 0, 0, 0, 0, 0, 1.6, 0.6, 0, 0, 0, 1.4, 
0.6, 0.4, 0.8, 0, 0, 0, 0, 0.2, 0, 0.2, 0, 0, 0, 0, 0.6, 0, 0, 
0, 0, 0.2, 1.2, 1, 1.8, 2, 1.8, 0.4, 0.6, 1.2, 1.8, 1.4, 1.2, 
0.6, 0.4, 0, 0.2, 0.2, 1.6, 1.6, 1.4, 0.8, 0.4, 0.2, 0.2, 0, 
0.6, 0, 0.4, 0.4, 0.2, 0.2, 0.2, 0.4, 0.4, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.6, 0, 0, 0, 0.2, 0.2, 0.4, 
0.4, 1.6, 1.8, 1.2, 1.4, 1.4, 1.4, 0.6, 0.6, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), X2006.h1 = c(0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 2, 4.8, 1, 0, 0, 0, 0, 0, 0, 0, 0.8, 0, 0, 0, 0, 
0, 0, 6.6, 0.2, 0, 0, 0.2, 0, 0, 0.2, 0, 1.4, 0, 1.2, 0, 0.2, 
0, 0.2, 1, 0, 0, 0, 0, 0, 0.2, 1.8, 2, 2.2, 0.6, 0.8, 0, 0, 0, 
0.2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.2, 0, 0, 0.4, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.2, 1.8, 5.8, 0.2, 0.4, 0, 
3.8, 0.2, 1.2, 0.4, 0, 0, 1, 0.4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.2, 0.6, 0.4, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.8, 0.8, 1, 0.2, 
0, 0.2, 0, 0, 0.6, 2.4, 0.2, 0, 0.2, 0, 0, 1.6, 0.2, 2, 0, 1.2, 
4.6, 0.6, 0, 0, 0, 0, 0, 0, 0, 0, 0.4, 0, 0, 0, 0, 0, 0.2, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.8, 0.4, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.2, 0.2, 0, 0, 0, 0, 0.2, 0, 
0, 0, 0, 0, 0, 0, 0, 0.2, 1.8, 0.6, 0, 0, 0, 0.4, 2, 1, 0.8, 
0.4, 0.2, 0, 0.2, 0, 0.8, 0.8, 0.2, 0.2, 0, 0.4, 0.4, 0.6, 0.8, 
4, 2, 0.8, 2.6, 1.4, 0.6, 1, 1, 1, 1.2, 1.2, 0.8, 1.6, 1.8, 0.4, 
0.2, 0.2, 0.2, 0.4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0.6, 1.2, 0.6, 0.8, 0.8, 1, 0.8, 1.2, 1.2, 0.8, 1, 2.2, 3.4, 
2.6, 1.8, 1.6, 1.8, 3.6, 3, 1.8, 3.2, 1.8, 1, 0.6, 0.4, 0, 1, 
0.6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3.6, 3.8, 0.2, 0.4, 
0, 0.2, 0.2, 0.4, 0.2, 0.2, 0.2, 0.4, 0, 0, 0, 0.2, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.2, 0.2, 0, 0.2, 0.6, 
0, 0.6, 0.4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.4, 1, 0, 0, 0, 0.2, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.6, 0.4, 0.6, 0.4, 0.6, 
1, 0.8, 0.2, 0, 0, 0.2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0.2, 0.6, 1.4, 2.2, 0, 0.4, 1, 0.6, 0, 
1.2, 1.6, 0.6, 0, 0.2, 0, 0, 0, 0, 0, 0.2, 0, 0, 0.2, 0, 0, 0.2, 
0, 0.2, 0, 0, 0, 0, 0.2, 0, 0, 0, 0, 0, 0, 0.2, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.4, 0.2, 0, 1.2, 0.4, 1, 0.6, 
0.8, 1, 0, 0, 0, 0, 0), X2005.h24 = c(0, 0, 3.4, 21.4, 1.8, 1.4, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 8.6, 1.4, 0, 0, 0, 0, 0.6, 7, 6.4, 
21.8, 3.2, 0, 0, 0.6, 11.2, 0), X2006.h24 = c(0, 8.6, 11.2, 8.4, 
0, 0, 0, 0, 0, 7.8, 7.6, 1.2, 10.2, 7, 0, 0, 1.6, 7.6, 23.6, 
3.2, 0, 9, 31.4, 10, 2.2, 1.6, 0, 4.8, 10, 1.2, 4.6)), .Names = c("X2005.h1", 
"X2006.h1", "X2005.h24", "X2006.h24"))

Функция:

myfun<- function(x) {

  y<-as.matrix(sapply(x, as.numeric)) 
  #Aggregating hourly (h1) data to 6,12 hourly data      
  h<-sapply(c(1, 6, 12), function(hrs) colSums(matrix(y, ncol=length(x)/hrs)))
  hours<-sapply(list(h[[1]], h[[2]], h[[3]]), function(qq) list(qq))
  names(hours)<-c("h1", "h6", "h12")
  #Calculating means of 1, 6, 12 hourly data      
  means<-sapply(list(hours[[1]], hours[[2]], hours[[3]]), function(ss) mean(ss, na.rm = T))
  #means of 1, 6, 12 hourly data 
  mean1<-means[[1]]
  mean6<-means[[2]]
  mean12<-means[[3]]
  mean24<- means[[4]]   
  meanlist<-list(mean1, mean6, mean12, mean24)
  names(meanlist) <- c("mean1", "mean6", "mean12", "mean24")
  return(meanlist)
    }

То, что я хочу:

Как упоминалось ранее, получаются 6-12-24 часовые значения с агрегированием почасовых данных h1 как h6, h12 и h24. mean1, mean6, mean12 и mean24 рассчитываются в цикле с функцией lapply для каждого года.

Значит mean1, mean6, mean12 окей. Но чтобы получить mean24, я хочу использовать h24 данные (x2005.h24, x2006.h24, ...) вместо агрегированных h24 данных. Как мне этого добиться?

1 Ответ

0 голосов
/ 18 апреля 2019

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

# list with 1h data
l1 <- myd[grepl('h1', names(myd))]

# list with 6h and 12h data
l6_12 <- names(myd)[grepl('h1', names(myd))] %>% 
  lapply(function(x) {
    setNames(lapply(c(6,12), 
                    function(h) rowSums(matrix(myd[[x]], ncol = h))), 
             c(gsub('h1', 'h6', x), gsub('h1', 'h12', x)))
  }) %>% 
  unlist(recursive = FALSE)

# list with 24h data
l24 <- myd[grepl('h24', names(myd))]

# combine all three together and then take the mean of each element (in this case 8 elements in total)
c(l1, l6_12, l24) %>% lapply(mean)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...