我有一个带有两个向量的简单数据框,“ 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
}
}
我希望有人可以帮助我了解我在这里做错的所有事情。谢谢。
答案 0 :(得分:1)
我不太清楚你的追求,但这不是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)