В R ищем значение в строке ниже - PullRequest
0 голосов
/ 15 октября 2019

Я пытаюсь найти значение в строке ниже того, которое оценивается. Так, например, если у меня есть df X, и я хочу создать другую переменную с именем samp3, которая возвращает значение 1 каждый раз, когда B появляется в samp2, но я хочу, чтобы он возвращал одну строку выше B.

x <- data.frame(
  samp1=c(5,6,7,5,4,5,10,5,6,7), 
  samp2=c("A","A","B","C","B","A","A","A","A","A")
)

x$samp3 <- ifelse(x$samp2 =="B", 1, NA)

Это будет работать, если он находится в той же строке, но я не уверен, как изменить это, чтобы вернуть значение 1 в строке выше.

В идеале я бы получил df, как показано ниже.

x <- data.frame(
  samp1=c(5,6,7,5,4,5,10,5,6,7), 
  samp2=c("A","A","B","C","B","A","A","A","A","A"),
  samp3=c(NA,1,NA,1,NA,NA,NA,NA,NA,NA)
)

Любая помощь будет принята с благодарностью!

Ответы [ 3 ]

1 голос
/ 15 октября 2019

вот решение для data.table:

library(data.table)

setDT(x)

x[, samp3 := ifelse(shift(samp2, -1) == "B", 1, NA)]
0 голосов
/ 15 октября 2019
transform(x, samp3 = ifelse(c(as.character(samp2)[-1], NA) == "B", 1, NA))
#   samp1 samp2 samp3
#1      5     A    NA
#2      6     A     1
#3      7     B    NA
#4      5     C     1
#5      4     B    NA
#6      5     A    NA
#7     10     A    NA
#8      5     A    NA
#9      6     A    NA
#10     7     A    NA
0 голосов
/ 15 октября 2019

Одним из способов может быть использование dplyr::lead

x <- data.frame(
    samp1=c(5,6,7,5,4,5,10,5,6,7), 
    samp2=c("A","A","B","C","B","A","A","A","A","A"),
    stringsAsFactors = FALSE
)
x$samp3  <- ifelse(dplyr::lead(x$samp2,1,default = "NA") == "B",1,0)
> x
   samp1 samp2 samp3
1      5     A     0
2      6     A     1
3      7     B     0
4      5     C     1
5      4     B     0
6      5     A     0
7     10     A     0
8      5     A     0
9      6     A     0
10     7     A     0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...