Логическая строительная помощь в R - PullRequest
0 голосов
/ 12 сентября 2018

Я ищу помощь для построения логики в R. У меня есть набор данных, как показано на рисунке Sample_Data set

Для любых данных Pack и ID:

  1. для первого вхождения, cost=Rates
  2. для второго вхождения, cost = Rates[Current]- Rates[Previous]
  3. Для третьего случая, cost = Rates[Current]- Rates[Previous]

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

df_temp <- structure(list(Rates = c(100L, 200L, 300L, 400L, 500L, 600L), 
                          ID = structure(c(2L, 2L, 2L, 1L, 3L, 3L), .Label = c("wwww", 
                                                                               "xxxx", "yyyy"), class = "factor"), Pack = structure(c(1L, 
                                                                                                                                      1L, 2L, 1L, 2L, 2L), .Label = c("a", "b"), class = "factor"), 
                          Cost = c(100L, 100L, 300L, 400L, 500L, 100L)), class = "data.frame", row.names = c(NA, 
                                                                                                             -6L))

    calculate_TTF_or_S <- function(dput(df)){
      df <- arrange(df,ID,Rates)
      unique_sysids <- unique(df$ID)
      for (id in unique_sysids) {
        df_sub <- df[which(df$ID ==  id),]
        j=1
        for (i in seq_len(nrow(df_sub))){
          if (j==1){
            df$Cost[i] <- df_sub$Rates[j]
          } else {
            df$Cost[i] <- df_sub$Rates[j] - df_sub$Rates[j-1]
          }
          j <- j+1
        }
      }
      return (df$Cost)
    }


    df_temp$Cost <- calculate_TTF_or_S(df_temp)

1 Ответ

0 голосов
/ 12 сентября 2018

Вот решение с dplyr.

library(dplyr)
df_temp %>%    # Start with your existing table...
  group_by(Pack, ID) %>%    # For each combination of Pack and ID...
  mutate(calc_cost = if_else(row_number() == 1,  # Add new column that is either...
                             Rates,              # Rates for first appearance
                             Rates - lag(Rates)) # Otherwise, Rates minus prior Rates
  ) %>% ungroup()    # Finally, ungroup the table
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...