есть ли способ в R, чтобы значение столбца было таким, как указано выше, если оно соответствует определенным критериям в другом столбце - PullRequest
0 голосов
/ 05 апреля 2020

Я хочу, чтобы значение в столбце myrate было

  1. для первого значения myrate должно быть rupee (минус) amt
  2. для второго строка столбца myrate должна быть первым значением myrate (значение, полученное в точке 1) минус второе значение столбца Rupee, если «Имя» одинаково как в 1-й, так и во второй строке
  3. логика c шага 2 должна продолжаться до тех пор, пока не будет достигнуто новое значение в столбце Name (в данном случае: "sss") 4. снова во второй строке имени "sss", лог c из шага 2 следует продолжить

Я пытался использовать dplyr, который дает правильный ответ для некоторых итераций, но не для других.

пример таблицы

1 Ответ

0 голосов
/ 05 апреля 2020

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

# Example data

df <- data.frame(
  Name = c(rep("kkk", 3), rep("sss", 3), rep("ttt", 2)),
  Amt = c(20:27),
  Rupee = c(11, 333, 65, 90, 36, 71, 69, 32)
)
df
#>   Name Amt Rupee
#> 1  kkk  20    11
#> 2  kkk  21   333
#> 3  kkk  22    65
#> 4  sss  23    90
#> 5  sss  24    36
#> 6  sss  25    71
#> 7  ttt  26    69
#> 8  ttt  27    32

# Helper function
myrate <- function(df) {
  # Init myrate = 0
  df$myrate <- 0
  # Add id = row number
  df$id <- 1
  df$id <- cumsum(df$id)
  # Loop over id or rows
  for (i in df$id) {
    df$myrate[i] <- 
      if (i == 1) {
        df$Rupee[i] - df$Amt[i]
      } else {
        df$myrate[i] <- df$myrate[i - 1] - df$Rupee[i]
      }
  }
  df["id"] <- NULL
  df
}

# Computation
library(dplyr)

df %>% 
  # Split by Name
  split(.$Name) %>%
  # Compute myrate for each Name
  lapply(myrate) %>%
  # Bind back in one df
  bind_rows()
#>   Name Amt Rupee myrate
#> 1  kkk  20    11     -9
#> 2  kkk  21   333   -342
#> 3  kkk  22    65   -407
#> 4  sss  23    90     67
#> 5  sss  24    36     31
#> 6  sss  25    71    -40
#> 7  ttt  26    69     43
#> 8  ttt  27    32     11

Создано в 2020-04-05 представьте пакет (v0.3.0)

...