使用R for循环更新数据框中的列值

时间:2018-12-04 00:45:36

标签: r

我有一个带有两个向量的简单数据框,“ 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
    }
  }

我希望有人可以帮助我了解我在这里做错的所有事情。谢谢。

1 个答案:

答案 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)