我有這樣的 2 列資料:
v1 = c(0, 29, 32, 29, 32, 28, -59, 30)
v2 = c(0, 0, 0, 0, 1, 1, 0, 1)
data = data.frame(v1, v2)
v1 v2
1 0 0
2 29 0
3 32 0
4 29 0
5 32 1
6 28 1
7 -59 0
8 30 1
我想按如下方式更改列 v2 的值:如果 v1 的值為負,則將 v2 之前的所有 1 更改為 0。我可以使用 for 回圈使用R. 有沒有辦法在不應用 for 回圈(可能使用dplyr包)的情況下做同樣的事情?
更新
我的實際問題比我之前解釋的情況更普遍。我為混亂道歉。我的資料可以有多個負值,如給定示例中的:

uj5u.com熱心網友回復:
確定位置的dplyr解決方案:cumsum()v1 < 0
library(dplyr)
data %>%
mutate(v2 = ifelse(row_number() < which.max(cumsum(v1 < 0)), 0, v2))
v1 v2
1 0 0
2 29 0
3 32 0
4 29 0
5 32 0
6 28 0
7 -59 0
8 30 1
如果資料有多個負值:
data <- data.frame(v1 = c(0, 29, 32, 60, -30, 31, -31, 31),
v2 = c(0, 0, 0, 1, 0, 1, 0, 1))
我的代碼給出(result列):
v1 v2 result
1 0 0 0
2 29 0 0
3 32 0 0
4 60 1 0
5 -30 0 0
6 31 1 0
7 -31 0 0
8 31 1 1
uj5u.com熱心網友回復:
最后更新:
v1= c(0 , 29, 32 , 60, -30 , 31, -31, 31 )
v2=c(0, 0, 0, 1, 0, 1,0,1)
data=data.frame(v1,v2)
data %>%
group_by(group_id = lag(cumsum(v1<0), default=0)) %>%
mutate(v2 = lag(cumsum(v1<0), default = min(v2))) %>%
ungroup() %>%
select(-group_id)
v1 v2
<dbl> <dbl>
1 0 0
2 29 0
3 32 0
4 60 0
5 -30 0
6 31 0
7 -31 0
8 31 1
第一個答案:
我們可以lag一起使用cumsum:
library(dplyr)
data %>%
mutate(v2 = lag(cumsum(v1<0), default = 0))
v1 v2
1 0 0
2 29 0
3 32 0
4 29 0
5 32 0
6 28 0
7 -59 0
8 30 1
uj5u.com熱心網友回復:
不需要花哨的東西,找到最后一個1并在 2 步中將所有先前的 1 覆寫為零
# Find last one
lastO <- max(which(data$v1))
if(length(last0)){
# Overwrite all v2 where v2 == 1 and the row is prior to the last row in v1
data$v2[data$v2 == 1 & seq.int(lastO) < lastO] <- 0
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/471122.html
下一篇:如何在if條件下使用匯入的列舉?
