【问题标题】:Adding rows to a data.table according to column values根据列值将行添加到 data.table
【发布时间】:2016-02-27 18:23:04
【问题描述】:

我正在处理一个大型数据集,我需要向其中添加行。这个问题是在另一个问题中提出的,但我将这个特定问题与原始问题中的其他问题分开。我对 SO 还很陌生,所以如果这不是“完成”的事情,请告诉我。

数据示例:

yr   week   id  days rev    p1  p2 p3   f1  f2  f3  f4
2016    3   1   1   5568.3  0   1   0   0   0   0   0
2016    4   1   3   8869.53 0   1   0   0   0   0   0
2016    5   1   2   12025.8 0   1   0   0   0   0   0
2016    6   1   2   9126.6  0   1   0   0   0   0   0
2016    7   1   3   4415.4  0   1   0   0   0   0   0
2016    8   1   2   11586.6 0   1   0   0   0   0   0
2016    10  1   1   2144.4  0   1   0   0   0   0   0
2016    11  1   1   2183.25 0   1   0   0   0   0   0
2016    14  1   2   4998    0   1   0   0   0   0   0
2016    15  1   3   117     0   1   0   0   0   0   0
2016    1   2   4   12743.3 0   0   1   1   1   0   0
2016    2   2   2   7473.48 0   0   1   1   1   0   0
2016    5   2   2   8885.52 0   0   1   1   1   0   0
2016    7   2   1   15330.6 0   0   1   1   1   0   0
2016    8   2   2   3763.8  0   0   1   1   1   0   0
2016    9   2   1   2274.05 0   0   1   1   1   0   0

对于 id 和 yr 的每个组合,都有几行对应于周的数据。 p1:p3 和 f1:f4 列是 id/yr 不变的,rev 随周变化。

对于 yr/id 的每个组合,都有一个星期的最大值。我想要做的是添加缺失的行,从一个开始为 week=1,直到该 yr/id 组合的最大值。

我想结束:

yr  week    id  days    rev p1  p2  p3  f1  f2  f3  f4
2016    1   1   0   NA      0   1   0   0   0   0   0
2016    2   1   0   NA      0   1   0   0   0   0   0
2016    3   1   1   5568.3  0   1   0   0   0   0   0
2016    4   1   3   8869.53 0   1   0   0   0   0   0
2016    5   1   2   12025.8 0   1   0   0   0   0   0
2016    6   1   2   9126.6  0   1   0   0   0   0   0
2016    7   1   3   4415.4  0   1   0   0   0   0   0
2016    8   1   2   11586.6 0   1   0   0   0   0   0
2016    9   1   0   NA      0   1   0   0   0   0   0
2016    10  1   1   2144.4  0   1   0   0   0   0   0
2016    11  1   1   2183.25 0   1   0   0   0   0   0
2016    12  1   0   NA      0   1   0   0   0   0   0
2016    13  1   0   NA      0   1   0   0   0   0   0
2016    14  1   2   4998    0   1   0   0   0   0   0
2016    15  1   3   117     0   1   0   0   0   0   0
2016    1   2   4   12743.3 0   0   1   1   1   0   0
2016    2   2   2   7473.48 0   0   1   1   1   0   0
2016    3   2   0   NA      0   0   1   1   1   0   0
2016    4   2   0   NA      0   0   1   1   1   0   0
2016    5   2   2   8885.52 0   0   1   1   1   0   0
2016    6   2   0   NA      0   0   1   1   1   0   0
2016    7   2   1   15330.6 0   0   1   1   1   0   0
2016    8   2   2   3763.8  0   0   1   1   1   0   0
2016    9   2   1   2274.05 0   0   1   1   1   0   0

我曾尝试使用 data.table 包中的 CJ,但问题是每个 id/season 组的连接都不同。任何建议表示赞赏。

【问题讨论】:

  • 您需要先找到每个 year/id 的最大值,然后找到缺失的周数,然后为这些缺失的周添加新行。
  • 我使用的第一部分:maxwk
  • 我认为建议第二部分的一般行动计划是为每个 yr/id 组合生成一周的一列值,然后找出原始数据中缺少哪些值设置,然后创建新行?
  • 如果您的数据集名为DT,请尝试DT[, .SD[match(1:max(week), week)], by = .(yr, id)]
  • 第二部分我猜是这样的:length

标签: r dataframe data.table


【解决方案1】:

使用 dplyr (v0.4.3) 和来自 tidyr (v0.4.1) 的 complete 函数分组应该可以解决问题:

library(dplyr)
library(tidyr)

df %>% 
  group_by(yr, id) %>% 
  complete(week = 1:max(week)) %>% 
  replace_na(list(days = 0)) %>% 
  group_by(yr, id) %>% 
  mutate_each(funs(replace(., is.na(.), mean(., na.rm = T))), p1:f4)

【讨论】:

  • 谢谢!我在遵循您的代码时遇到了一些麻烦-我是 dplyr 新手。除了 yr、id 和 rev 列中出现的一些 NA 之外,代码似乎可以正常工作,并且 p1:p3 和 f1:f4 的值为“Nan”。
  • 您使用的是什么版本的 dplyr 和 tidyr?使用 dplyr 0.4.3 和 tidyr 0.4.1 为我工作。
  • 我刚刚从 CRAN 安装了软件包,所以我假设是最新版本。
  • 我不确定如何检查软件包的版本?
  • 这很有趣——在你上面的代码中'df'是一个data.table。我在没有将 df 设为 data.table (只是一个 data.frame)的情况下尝试了您的代码,并且我没有 NA 和 NaN 的问题.....
猜你喜欢
  • 1970-01-01
  • 2015-02-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多