【问题标题】:Is there a limit of factors in `dplyr::group_by`?`dplyr::group_by` 中的因素是否有限制?
【发布时间】:2021-12-28 17:58:36
【问题描述】:

我正在努力研究如何使用变量的lag 计算组件的磨损。但是,我需要计算不同组的磨损,所以我使用group_by 函数,但这里有一个问题,当我使用我需要分组的变量时,这会导致一列“NA's”,但是当我通过对具有较少因子的另一个变量进行分组来进行测试时,计算有效。

我使用的数据框有4093902 行和52 行。我需要分组以执行磨损计算的变量具有90183 因子。我测试过的另一个有效的有11321 因素。

这是我正在使用的代码:

final_date = result_data %>%
arrange((time)) %>%
  group_by(id_specific)%>%
  mutate(wear = dplyr::lag(some_value, n = 1, default = NA) - some_value)

有谁知道分组是否有因素限制?或者关于如何执行此计算的任何其他提示?

【问题讨论】:

  • 当我使用id_specific列时,没有结果,只创建了NA
  • 对,但是该组的行数更多
  • 我试过了,它只返回NA's for wear
  • 即你可以做` mutate(wear = rowSums(cbind(dplyr::lag(some_value, n = 1, default = NA), -1 * some_value), na.rm = TRUE))`
  • 如果你想回答我标记为正确!

标签: r dplyr lag


【解决方案1】:

NA 可以是 lag 默认返回第一个值 NA 的结果,也可以是其他列值(也可以是 NA)的结果。因此,当我们执行-(或任何算术)时,如果 lhs 或 rhs 中有任何 NA,它会返回 NA。一种选择是使用可以使用na.rm = TRUE的函数(rowSums

library(dplyr)
final_date <- result_data %>%
arrange((time)) %>%
  group_by(id_specific)%>%
  mutate(some_value_new = dplyr::lag(some_value, n = 1,
             default = NA)) %>%
  ungroup %>%
  mutate(wear = rowSums(cbind(some_value_new, -1 * some_value), 
              na.rm = TRUE), some_value_new = NULL)

注意:在执行rowSums 之前最好先ungroup 以获得一些效率

【讨论】:

  • 每组的第一个元素都是负数,你知道怎么设置为零吗?
  • 他们是这样的:`2020-11-02 26.1 -26.1`。即,相同的值,但为负
  • @DR15 不清楚。这是一个字符串还是三列?如果你想将它们设置为零。 mutate(new_column = replace(some_value, 1, 0))分组后
  • 是的,1 是位置索引,即每组的第一个元素。我更改了列名,以防您想保留原始列
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-02
  • 1970-01-01
  • 1970-01-01
  • 2019-04-12
相关资源
最近更新 更多