我有一个带有两个向量的简单数据框,“RECORDS”和“FLAG”,如下所示:
RECORDS FLAG
H12434 TRUE
W3211 FALSE
Maa FALSE
Mab FALSE
Mac FALSE
Mad FALSE
T1_12 FALSE
H7367 TRUE
R001 FALSE
W4810.5 FALSE
Maa FALSE
Mab FALSE
T2_12 FALSE
我想先将TRUE更改为1,然后将所有后续FALSE更改为1,当第二个TRUE出现时,将计数器增加1并将第二个TRUE和随后的FALSE更改为2.因此结果应如下所示:
RECORDS FLAG
H12434 1
W3211 1
Maa 1
Mab 1
Mac 1
Mad 1
T1_12 1
H7367 2
R001 2
W4810.5 2
Maa 2
Mab 2
T2_12 2
我尝试了很多像下面这样的循环,但我没有足够的经验让它工作。
counter = 0
for (i in seq_along(data))
{
if(data$flag == TRUE)
{
counter <- counter + 1
data$flag <- counter
}
else
{
data$flag <- counter
}
}
我希望有人可以帮助我理解我在这里做错的所有事情。谢谢。
我对你所追求的事情并不完全清楚,但这不仅仅是cumsum
的一个简单问题吗?
transform(df, FLAG = cumsum(FLAG))
# RECORDS FLAG
#1 H12434 1
#2 W3211 1
#3 Maa 1
#4 Mab 1
#5 Mac 1
#6 Mad 1
#7 T1_12 1
#8 H7367 2
#9 R001 2
#10 W4810.5 2
#11 Maa 2
#12 Mab 2
#13 T2_12 2
或者使用dplyr
library(dplyr)
df %>% mutate(FLAG = cumsum(FLAG))
df <- read.table(text =
"RECORDS FLAG
H12434 TRUE
W3211 FALSE
Maa FALSE
Mab FALSE
Mac FALSE
Mad FALSE
T1_12 FALSE
H7367 TRUE
R001 FALSE
W4810.5 FALSE
Maa FALSE
Mab FALSE
T2_12 FALSE", header = T)