R, вычтите значение из соответствующего и следующих значений в числовом столбце каждый раз, когда в другом столбце выполняются условия. - PullRequest
3 голосов
/ 26 мая 2020

Ниже у меня есть кадр данных с последовательными значениями в первом столбце (col1). Когда во втором столбце (col2) встречается 'q', необходимо вычесть 1 из соответствующего значения в столбце 1 и всех остальных значений, следующих в столбце 1. Когда встречается второй q, опять же, дополнительная 1 имеет следует вычесть из соответствующего значения в столбце 1 и всех остальных значений, следующих в столбце 1. et c. Обратите внимание, каждый новый фрейм данных имеет разные значения в столбцах 1 и 2. Мне было интересно, какой подход должен быть правильным? Я пробовал подмножество и операторы if else. Следующий код не может произвести последовательную нумерацию.

df$col3 = ifelse(df$mut!="q",df$col1, ifelse(grepl("q",df$col2),(df$col1-1),0) )

пример набора данных


col1 = c(115,116,117,118,119,120,121,122,123,124) 
col2 = c('s1','s2','s3', "q", "s4", "q", "s5", "q", "q", "s6")
df = data.frame(col1, col2)

col1 col2
115  s1
116  s2
117  s3
118  q
119  s4
120  q
121  s5
122  q
123  q
124  s6

Ожидаемый результат должен выглядеть следующим образом:

col1 col2 col3
115  s1   115
116  s2   116
117  s3   117
118  q    117
119  s4   118
120  q    118
121  s5   119
122  q    119
123  q    119
124  s6   120

Спасибо

1 Ответ

2 голосов
/ 26 мая 2020

Вы можете использовать cumsum, который суммирует случаи, когда df$col2 == "q", и вычитает эту форму df$col1.

df$col3 <- df$col1 - cumsum(df$col2 == "q")
#   col1 col2 col3
#1   115   s1  115
#2   116   s2  116
#3   117   s3  117
#4   118    q  117
#5   119   s4  118
#6   120    q  118
#7   121   s5  119
#8   122    q  119
#9   123    q  119
#10  124   s6  120
...