【问题标题】:Using data table or dplyr instead of loops使用数据表或 dplyr 而不是循环
【发布时间】:2020-09-09 20:33:12
【问题描述】:

这里有一个带有 for 循环的代码:

for (i in 1:length(mc_1$code))
{cmc1 = mc_1$code[i]
cmc2 = mc_1[mc_1$code == cmc1,]
cmc3 = cmc2[order(cmc2[ ,2], cmc2[ ,3]),]
mc_1[mc_1$code == cmc1,]$region = last(cmc3$region)
}

对于变量“code”中的每个值,mc_1 具有不同的行数。 mc_1 也有年份和月份的列(第 2 列和第 3 列),以及另一列,比如说,区域。即使是相同的“代码”在不同的月份和年份,“区域”也是不同的。

对于每个“代码”,我只想按月和年选择最近的区域(这就是我使用“order”的原因)并将该区域分配给该特定代码的所有行中的所有区域。

我确实有这个 for 循环,它有效。但是对于效率和代码长度问题,如何使用数据表或 dplyr 之类的东西更好地重写它?

【问题讨论】:

  • 如果你也能提供一些样本数据就太好了

标签: r loops dplyr datatable


【解决方案1】:

你可以使用 dplyr 包试试这个 以及n() 返回每​​组中的行数的事实

mc_1 %>% 
  group_by(code) %>% 
  arrange(year, month ) %>% 
  mutate(region = region[n()])

希望对你有帮助!!

【讨论】:

  • 感谢您的回答!首先,在这里使用mc_1$code 与仅使用code (以及其他变量)是否相同?如果我没有美元符号,我试图运行它可以工作,但我检查它不会返回一个唯一区域的唯一代码。如果我使用mc_1$code 之类的每个变量运行它,它会返回错误“列x1$Regional == x1$Regional[n()] 的长度必须为4(组大小)或1,而不是42035”。顺便说一句,我认为最后一行你应该使用双等号? (mutate(region == region[n()]))
  • 顺便说一句,我在数据中有其他列,但我只想更改每个代码的区域,使用最近的区域
  • 看来我是这样工作的:mc_1 = arrange(group_by(mc_1, code), year, month) mc_1 = mutate(mc_1, region = region[n()])
  • @Ian dplyr 的优点是您不需要使用$ 表示法,但可以直接在函数中访问列。因此您不再需要使用mc_1$code
  • 谢谢!我得到了它的工作,但我不知道为什么你的解决方案不能真正工作。顺便说一句,我不喜欢使用管道哈哈
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-06-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-26
  • 2013-12-28
  • 2016-05-30
相关资源
最近更新 更多