首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >R如何在每次重置前创建计数器并将其打印到新列

R如何在每次重置前创建计数器并将其打印到新列
EN

Stack Overflow用户
提问于 2020-02-28 00:14:55
回答 3查看 389关注 0票数 1

假设我有以下数据

代码语言:javascript
运行
复制
  df
R1 R2
0  0 
1  1
1  1
0  1
1  1 
0  0
0  1
1  0           
0  0
1  0
1  0
1  1        

我希望创建一个计数器--在每一列中--逐个计算'1's的出现,每次遇到0时重置,并在新列中输出计数。也就是说,在第1行,它将在第一步重置,然后计数到1,然后计数到2,然后重置,然后计数1,然后重置,复位,重置等,第1列的期望输出是:

代码语言:javascript
运行
复制
  df
R1(Counted) 
N/A   
N/A  
2  
N/A  
1   
N/A  
N/A  
1             
N/A  
N/A  
N/A  
3          

我想我需要这样的东西:

代码语言:javascript
运行
复制
Counter = 0  
for i = 1:nrow(df){
  if (???==1){
    counter=counter+1
  } else {
    counter=0
  }
}  

但是我真的对计数器没有经验,也不知道如何在重新设置计数器或类似的东西之前,不断地将它的计数打印到一个新的列中。

任何帮助都非常感谢。

EN

Stack Overflow用户

回答已采纳

发布于 2020-02-28 01:00:38

我们可以创建一个函数,在data.table::rleid的帮助下,根据价值的每一个变化创建组。将所有值转换为NA,但值为1且是组中最后一个元素的值除外。

代码语言:javascript
运行
复制
get_counter <- function(ct) {
   ave(ct, data.table::rleid(ct), FUN = function(x) 
           replace(seq_along(x), x != 1 | seq_along(x) != length(x), NA))
}

这个函数可以使用lapply应用于多个列。

代码语言:javascript
运行
复制
df[paste0("ct_", names(df))] <- lapply(df, get_counter)
df

#   R1 R2 ct_R1 ct_R2
#1   0  0    NA    NA
#2   1  1    NA    NA
#3   1  1     2    NA
#4   0  1    NA    NA
#5   1  1     1     4
#6   0  0    NA    NA
#7   0  1    NA     1
#8   1  0     1    NA
#9   0  0    NA    NA
#10  1  0    NA    NA
#11  1  0    NA    NA
#12  1  1     3     1

数据

代码语言:javascript
运行
复制
df <- structure(list(R1 = c(0L, 1L, 1L, 0L, 1L, 0L, 0L, 1L, 0L, 1L, 
1L, 1L), R2 = c(0L, 1L, 1L, 1L, 1L, 0L, 1L, 0L, 0L, 0L, 0L, 1L
)), class = "data.frame", row.names = c(NA, -12L))
票数 3
EN
查看全部 3 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60443584

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档