如何解决在R中将w更改为循环
我有一个看起来像这样的数据...
df <- tibble (
old_col = c(FALSE,FALSE,TRUE,FALSE))
...并且我正在尝试编写一个for循环,该循环将添加一个递增计数的变量,每次更改为TRUE时都会更改,因此我最终得到了这样的df ...
df <- tibble (
old_col = c(FALSE,FALSE),new_col = c(1,1,2,3,3)
到目前为止,我已经尝试过此代码...
for(i in 1:nrow(df)){
if(i==1){
df$new_col[i]= 1 # For first point
}
else if(df$old_col[i] == "FALSE") {
df$new_col[i]=df$new_col[i-1]
}
else {
df$new_col[i]=2
}
}
但是其他部分是错误的。我不知道该怎么做才能使其计数到3,然后在下一次有TRUE时计数为4。
我是新手!谢谢您的帮助!
PS,如果有解决此类问题的方法,我很想听听。
解决方法
您可以对逻辑值进行累计和,逻辑值将针对每个TRUE
值自动递增。由于第一个值为FALSE
,因此我们将+ 1
添加到cumsum
的输出中。
df$new_col <- cumsum(df$old_col) + 1
df
# A tibble: 12 x 2
# old_col new_col
# <lgl> <dbl>
# 1 FALSE 1
# 2 FALSE 1
# 3 FALSE 1
# 4 FALSE 1
# 5 FALSE 1
# 6 TRUE 2
# 7 FALSE 2
# 8 FALSE 2
# 9 FALSE 2
#10 TRUE 3
#11 FALSE 3
#12 FALSE 3
使用tidyverse
:
library(dplyr)
df %>% mutate(new_col = cumsum(old_col) + 1)
,
cumsum()
是到达此处的标准方法。您仍然可以使用循环,仅需进行少量修改(我还添加了一些简化/清理方法):
for (i in 1:nrow(df)) {
if (i == 1) {
# For first point
df$new_col[i] = 1
} else if (!df$old_col[i]) {
df$new_col[i] = df$new_col[i-1]
} else {
df$new_col[i] = df$new_col[i-1] + 1L
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。