перебрать столбец и добавить последние значения в r - PullRequest
0 голосов
/ 06 июня 2018

У меня есть фрейм данных, такой как ниже.Я хочу добавить последнее значение в столбце за последние три месяца.В этом случае это будет 6 + 7 + 0 = 13. Как я могу написать цикл для добавления чисел в R

df <- read.table(textConnection('
mth     n value    
jan     1 5      
feb     2 1  
feb     2 3   
mar     3 2  
mar     3 8  
mar     3 0  
apr     4 6  
apr     4 0  
apr     4 2  
apr     4 7  
may     5 2  
may     5 1  
may     5 4  
may     5 2  
may     5 6  
'), header=T)

Ответы [ 4 ]

0 голосов
/ 06 июня 2018

Опцией использования dplyr может быть:

библиотека (dplyr)

df %>% group_by(n,  mth) %>%
  summarise(last_value = last(value)) %>%
  tail(3) %>%
  ungroup() %>%
  summarise(sum = sum(last_value))

# # A tibble: 1 x 1
# sum
# <int>
#   1    13
0 голосов
/ 06 июня 2018

Я собираюсь ответить

  • Используя data.table
  • , так как данные появились изначально, надеюсь, могут быть приняты, если данные есть.разные

Решение

library(data.table)
dt[, value[.N], mth][(.N-2):.N, sum(V1)]
[1] 13

Данные

dt <- structure(list(mth = c("jan", "feb", "feb", "mar", "mar", "mar", 
                       "apr", "apr", "apr", "apr", "may", "may", "may", "may", "may"
), n = c(1L, 2L, 2L, 3L, 3L, 3L, 4L, 4L, 4L, 4L, 5L, 5L, 5L, 
         5L, 5L), value = c(5L, 1L, 3L, 2L, 8L, 0L, 6L, 0L, 2L, 7L, 2L, 
                            1L, 4L, 2L, 6L)), row.names = c(NA, -15L), class = c("data.table", 
                                                                                 "data.frame"))
0 голосов
/ 06 июня 2018

Использование tidyverse :

library(tidyverse)

df %>% 
    arrange(n) %>% 
    group_by(mth) %>%
    slice(n()) %>% 
    arrange(n) %>% 
    tail(3) %>% 
    ungroup(mth) %>% 
    summarise(sum_value = sum(value))
0 голосов
/ 06 июня 2018

tapply обрабатывает mth как строку, если она не преобразована в множитель.Еще один подход для жесткого кодирования месяца, который, используя только 3, более читабелен:

df$mth <- factor(df$mth, levels=c('jan', 'feb', 'mar', 'apr', 'may'))
sum(tail(tapply(df$value, df$mth, tail, 1), 3))

Другой подход

sum(tapply(df$value, df$mth, tail, 1)[c('mar', 'apr', 'may')])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...