【问题标题】:No loop for break/next, jumping to top level [duplicate]没有中断/下一个循环,跳转到顶层[重复]
【发布时间】:2020-06-29 23:02:02
【问题描述】:

我有一个数据框,用于存储某人在本月的每笔交易中花费的金额。我正在尝试创建一个循环来检查重复的用户 ID,然后将他们总共花费的金额汇总并存储在他们出现的第一条记录中。它应该将他们在任何其他事件中花费的金额设置为 0。

当我停止运行时,我不断收到“错误:没有循环中断/下一个,跳转到顶层”:

# Number of trips 
numTrips <- NROW(tripData)

# For each trip in data
for (i in 1:numTrips){
  
  # For each trip after i
  for (j in ((i+1): numTrips)){
    
    # If the user ID's match, sum prices 
    if (tripData[i,]$user_id == tripData[j,]$user_id){
      tripData[i,]$original_price <- tripData[i,]$original_price + tripData[j,]$original_price 
        tripData[j,]$original_price <- 0
    }
      
  }
}

有人可以帮忙吗?

【问题讨论】:

  • 如果您包含一个简单的reproducible example,其中包含可用于测试和验证可能解决方案的示例输入和所需输出,则更容易为您提供帮助。有多少行?他们写这个的方式是二次缩放的,所以如果你有大量的行,它会花费很长时间。看起来使用dplyr group_bysummarize 会更容易

标签: r error-handling


【解决方案1】:

我会接受@MrFlick 的评论并给你一个示例:

set.seed(42)
dat <- tibble(
  id = rep(1:3, each=3),
  when = sort(Sys.Date() - sample(10, size=9)),
  amt = sample(1e4, size=9))
dat
# # A tibble: 9 x 3
#      id when         amt
#   <int> <date>     <int>
# 1     1 2020-06-19   356
# 2     1 2020-06-20  7700
# 3     1 2020-06-21  3954
# 4     2 2020-06-22  9091
# 5     2 2020-06-23  5403
# 6     2 2020-06-24   932
# 7     3 2020-06-25  9189
# 8     3 2020-06-27  5637
# 9     3 2020-06-28  4002

听起来您想sum 每个 id 的金额,但保留各个行,其余金额为零。

dat %>%
  group_by(id) %>%
  mutate(amt2 = c(sum(amt), rep(0, n() - 1)))
# # A tibble: 9 x 4
# # Groups:   id [3]
#      id when         amt  amt2
#   <int> <date>     <int> <dbl>
# 1     1 2020-06-19   356 12010
# 2     1 2020-06-20  7700     0
# 3     1 2020-06-21  3954     0
# 4     2 2020-06-22  9091 15426
# 5     2 2020-06-23  5403     0
# 6     2 2020-06-24   932     0
# 7     3 2020-06-25  9189 18828
# 8     3 2020-06-27  5637     0
# 9     3 2020-06-28  4002     0

如果您只想要摘要,则可以使用:

dat %>%
  group_by(id) %>%
  summarize(amt = sum(amt))
# # A tibble: 3 x 2
#      id   amt
#   <int> <int>
# 1     1 12010
# 2     2 15426
# 3     3 18828

或者如果你想保留日期范围,那么

dat %>%
  group_by(id) %>%
  summarize(whenfrom = min(when), whento = max(when), amt = sum(amt))
# # A tibble: 3 x 4
#      id whenfrom   whento       amt
#   <int> <date>     <date>     <int>
# 1     1 2020-06-19 2020-06-21 12010
# 2     2 2020-06-22 2020-06-24 15426
# 3     3 2020-06-25 2020-06-28 18828

【讨论】:

  • 是的,我想总结一下!谢谢你:)
  • @MrFlick 应该得到称赞,我只是充当他的语音激活码 ;-)
猜你喜欢
  • 2021-10-20
  • 1970-01-01
  • 2012-06-02
  • 2021-03-30
  • 2014-04-10
  • 1970-01-01
  • 1970-01-01
  • 2020-11-29
  • 2021-08-27
相关资源
最近更新 更多