【问题标题】:Resetting the cumulative sum when a condition is met in R [duplicate]在R中满足条件时重置累积和[重复]
【发布时间】:2019-07-26 16:24:55
【问题描述】:

所以我现在有一个看起来像这样的表:

data_wrong <- data.table(State = c("NY", "NY", "NY", "NY", "PA", "PA", "PA", 
"NJ", "NJ", "NJ"), Year = c("1973", "1974", "1975", "2005", "1992", "1993", 
"2001", "1930", "1931", "1932"), Consecutive_Yrs = c(1,2,3,1,1,6,1,1,9,10))

我希望它看起来像这样:

data <- data.table(State = c("NY", "NY", "NY", "NY", "PA", "PA", "PA", "NJ", 
"NJ", "NJ"), Year = c("1973", "1974", "1975", "2005", "1992", "1993", 
"2001", "1930", "1931", "1932"), Consecutive_Yrs = c(1,2,3,1,1,2,1,1,2,3))

这是我现在用来获取表格的代码:

data$diff <- NA

data <- data %>%
  group_by(State) %>%
  arrange(State) %>%
  mutate(diff = Year - lag(Year, default = first(Year)))

data$Consecutive_Yrs <- 1

data$Consecutive_Yrs <- ifelse(data$diff == 1, cumsum(data$Consecutive_Yrs), 
1)

任何帮助将不胜感激:)

【问题讨论】:

  • 我收到的两个答案都不适用于我的 R 版本。有人可以为我提出建议和想法吗?谢谢!

标签: r sum reset cumsum


【解决方案1】:

作为。它是data.table,一个选项是使用data.table 方法

library(data.table)
data_wrong[, grp := cumsum(c(TRUE, diff(as.numeric(Year)) > 1)), 
       .(State)][, Consecutive_Yrs := as.numeric(seq_len(.N)), .(State, grp)]
data_wrong
#    State Year Consecutive_Yrs grp
# 1:    NY 1973               1   1
# 2:    NY 1974               2   1
# 3:    NY 1975               3   1
# 4:    NY 2005               1   2
# 5:    PA 1992               1   1
# 6:    PA 1993               2   1
# 7:    PA 2001               1   2
# 8:    NJ 1930               1   1
# 9:    NJ 1931               2   1
#10:    NJ 1932               3   1

或使用rowid

data_wrong[, Consecutive_Yrs2 := rowid(rleid(as.numeric(Year) - 
        shift(as.numeric(Year), fill = as.numeric(Year[1])) >1)), .(State)]

【讨论】:

  • 我收到此错误:[&lt;-.data.table(x, j = name, value = value) 中的错误:(列表)对象不能强制输入“整数”此外:警告消息:在 @ 987654327@(x, j = name, value = value) : 提供 9 个项目分配给“Consecutive_Yrs”列的 16510 个项目(回收剩余 4 个项目)。
  • 哦,等等,我遇到了一个错误,但它实际上运行并工作了..可以吗?
  • @Sarah 第一个错误是因为您在数据集中已经有一个 numeric 类型的“Consecutive_Yrs”列。 seq_len(.N) 返回 integer。要么,将其转换为numeric,要么创建一个新的列名来解决它
  • @Sarah 你能在新创建的数据上运行更新的代码吗
  • 我仍然收到该错误。我将所有变量都更改为数字。但它仍然在输出我想要的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-14
  • 1970-01-01
  • 2018-08-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多