как заменить значение в аккуратном data.frame как условную сумму других - PullRequest
0 голосов
/ 31 мая 2018

Для data.frame, аналогичного приведенному ниже (в моем случае читается как .csv с очень большим количеством переменных), как заменить значение, скажем, переменной a на сумму переменных a и f, на соответствующие даты?Я смог сделать это только длинными, неуклюжими способами.

library(lubridate)
timestep <- c("10/31/1921","11/30/1921","12/31/1921","1/31/1922","2/28/1922","3/31/1922","4/30/1922","5/31/1922","6/30/1922","7/31/1922","8/31/1922","9/30/1922",
           "10/31/1921","11/30/1921","12/31/1921","1/31/1922","2/28/1922","3/31/1922","4/30/1922","5/31/1922","6/30/1922","7/31/1922","8/31/1922","9/30/1922",
           "10/31/1921","11/30/1921","12/31/1921","1/31/1922","2/28/1922","3/31/1922","4/30/1922","5/31/1922","6/30/1922","7/31/1922","8/31/1922","9/30/1922",
           "10/31/1921","11/30/1921","12/31/1921","1/31/1922","2/28/1922","3/31/1922","4/30/1922","5/31/1922","6/30/1922","7/31/1922","8/31/1922","9/30/1922",
           "10/31/1921","11/30/1921","12/31/1921","1/31/1922","2/28/1922","3/31/1922","4/30/1922","5/31/1922","6/30/1922","7/31/1922","8/31/1922","9/30/1922",
           "10/31/1921","11/30/1921","12/31/1921","1/31/1922","2/28/1922","3/31/1922","4/30/1922","5/31/1922","6/30/1922","7/31/1922","8/31/1922","9/30/1922")  

value <- c(0,0,4474,7027,32458,20702,29682,53150,20632,0,0,0,0,0,26569,22253,0,1894,25018,7119,0,2289,0,988,0,0,0,3869,8138,0,0,0,0,0,950,0,0,158,6028,2086,67193,
        4191,22303,5584,0,0,222,0,345,54,78,4545,2,4,0,0,186,113,256,4665,5756,78,34,20,323,3,0,0,9,354,299,8735)

variable <- c("a","a","a","a","a","a","a","a","a","a","a","a","b","b","b","b","b","b","b","b","b","b","b","b","c","c","c","c","c","c","c","c","c","c","c","c","d",
           "d","d","d","d","d","d","d","d","d","d","d","e","e","e","e","e","e","e","e","e","e","e","e","f","f","f","f","f","f","f","f","f","f","f","f")

df <- data.frame(timestep, value, variable) 
df$timestep <- mdy(df$timestep)


ExpectedValues <- c(5756,78,4508,7047,32781,20705,29682,53150,20641,354,299,8735,0,0,26569,22253,0,1894,25018,7119,0,2289,0,988,0,0,0,3869,8138,0,0,0,0,0,950,0,0,158,6028,2086,67193,
                  4191,22303,5584,0,0,222,0,345,54,78,4545,2,4,0,0,186,113,256,4665,5756,78,34,20,323,3,0,0,9,354,299,8735)

Expected_df <- data.frame(timestep, ExpectedValues, variable)

Ответы [ 2 ]

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

Как насчет этого в базе R, используя by:

df.res <- do.call(rbind, unname(by(df, df$timestep, function(x) {
    x$value[x$variable == "a"] = sum(x$value[x$variable %in% c("a", "f")]);
    x})));
head(df.res);
#     timestep value variable
#1  1921-10-31  5756        a
#13 1921-10-31     0        b
#25 1921-10-31     0        c
#37 1921-10-31     0        d
#49 1921-10-31   345        e
#61 1921-10-31  5756        f
0 голосов
/ 31 мая 2018

Вы можете использовать spread и gather из dplyr:

library(tidyverse)

df %>% 
  spread(variable, value) %>%
  mutate(a = a + f) %>%
  gather(variable, value, -timestep)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...