R правил для новой переменной на основе текущего предыдущего и следующего значения - PullRequest
0 голосов
/ 14 июня 2019

data

data=data.frame("person"=c(1,1,1,1,1,2,2,2,2,2,2,3,3,3,3,3,4,4,4,4,4),
                 "score"=c(1,2,1,3,4,3,1,2,1,3,1,2,3,1,3,2,2,3,1,3,3),
                  "want"=c(1,1,1,3,4,1,1,1,1,1,1,1,1,1,1,3,1,1,1,3,3))

Я приложу все усилия, чтобы объяснить, чего я надеюсь достичь.

По сути, я хочу создать столбец 'want', который зависит от предыдущего, текущегои следующие значения.

В данных индивидуум может иметь оценку 1,2,3,4.Я хочу новую переменную 'want', которая следует этим правилам:

  1. будет присвоено 3 балла в момент T, если в момент T-1 был 3 балла и 2 или 2.3 в момент времени T + 1.
  2. оценка 3 будет назначена в момент времени T, если была оценка 3 в момент времени T и оценка 4 в момент времени T + 1.
  3. в противном случае все значения должны быть 1, КРОМЕ, если есть 4.

Ответы [ 2 ]

2 голосов
/ 14 июня 2019

Предполагается, что он похож на ваш want столбец? Это дает разные результаты, но, похоже, следует вашей логике:

library(dplyr)
data %>% 
  group_by(person) %>% 
  mutate(want2 = case_when(
    (lag(score) == 3 & lead(score) %in% c(2,3)) ~ 3,
    score == 3 & lead(score) == 4 ~ 3,
    T ~ 1))
0 голосов
/ 14 июня 2019

Ваши столбцы хотят не следовать вашим собственным правилам.Обратите внимание, что у вас есть 4 в 5-й позиции, но нет правила назначать 4 (другие значения, по вашим правилам, неправильно просчитаны).

# load packages
library(data.table)

# create data
dt <- data.table(person = c(1,1,1,1,1,2,2,2,2,2,2,3,3,3,3,3,4,4,4,4,4),
                 score = c(1,2,1,3,4,3,1,2,1,3,1,2,3,1,3,2,2,3,1,3,3))

# Make lead and lag vectors
dt[, tMinus := shift(score, 1, type = "lag")]
dt[, tPlus := shift(score, 1, type = "lead")]

# calculate want
dt[, want := 1][tMinus == 3 & tPlus %in% 2:3, want := 3][score == 3 & tPlus == 4, want := 3]

# remove unneeded columns
dt[, c("tMinus", "tPlus") := NULL]

Это дает результат:

> dt
    person score want
 1:      1     1    1
 2:      1     2    1
 3:      1     1    1
 4:      1     3    3
 5:      1     4    3
 6:      2     3    1
 7:      2     1    3
 8:      2     2    1
 9:      2     1    1
10:      2     3    1
11:      2     1    3
12:      3     2    1
13:      3     3    1
14:      3     1    3
15:      3     3    1
16:      3     2    3
17:      4     2    1
18:      4     3    1
19:      4     1    3
20:      4     3    1
21:      4     3    1
    person score want

Было не ясно, хотите ли вы рассчитать want по person.Если это так, то рассмотрите следующий код:

dt[, tPlus := shift(score, 1, type = "lead"), by = person]
dt[, tMinus := shift(score, 1, type = "lag"), by = person]
dt[, want := 1][tMinus == 3 & tPlus %in% 2:3, 
                want := 3][score == 3 & tPlus == 4, 
                           want := 3][, 
          c("tMinus", "tPlus") := NULL][]
...