数据表根据其他列中的ID添加计算列

时间:2017-08-17 21:57:30

标签: r data.table data-manipulation

我无法根据同一数据集中的另一列添加一个具有该值的列。

以下是我正在使用的示例:

+----+------+------------+
| id | type |    date    |
+----+------+------------+
|  1 | a    | 2017-08-01 |
|  1 | b    | 2017-08-05 |
|  2 | a    | 2017-08-01 |
|  3 | c    | 2017-08-01 |
|  4 | a    | 2017-08-02 |
|  5 | a    | 2017-08-03 |
|  5 | b    | 2017-08-04 |
+----+------+------------+

我的目标是创建一个a_date列,其中所有适用行的日期是typea时的日期。像这样:

+----+------+------------+------------+
| id | type |    date    |   a_date   |
+----+------+------------+------------+
|  1 | a    | 2017-08-01 | 2017-08-01 |
|  1 | b    | 2017-08-05 | 2017-08-01 |
|  2 | a    | 2017-08-01 | 2017-08-01 |
|  3 | c    | 2017-08-01 |            |
|  4 | a    | 2017-08-02 | 2017-08-02 |
|  5 | a    | 2017-08-03 | 2017-08-03 |
|  5 | b    | 2017-08-04 | 2017-08-03 |
+----+------+------------+------------+

现在在R中执行此操作我创建了一个数据表,并尝试使用group by并使用我用于计算的临时列:

test <-data.table(id = c(1,1,2,3,4,5,5), type = c("a","b","a","c","a","a","b"), 
                  date = c("2017-08-01", "2017-08-05", "2017-08-01", 
                           "2017-08-01", "2017-08-02", "2017-08-03", "2017-08-04"))
test[type == "a",temp_date := date]
test[, a_date := min(temp_date), by = c("id")]

然而,我最终得到的完全不同。我试图将这些表分开,我只有iddate的表,并进行如下合并:

test <- merge(test, ids, by.x=id, by.y=id)

这也产生了不希望的结果,并且与初始“测试”表的长度不同。 (我已尝试过all.x选项)

我实际处理的数据集大约有2000万行,并且只是通过加载它使我们的服务器非常接近其限制,因此使用合并或具有表的多个副本也不是真正的选项。

这是一个使用for循环并有第二个表的工作版本:

ids <- test[!is.na(temp_date),list(id, temp_date)]


for (i in ids[,id]){
  test[id == i, create_date := ids[id == i, temp_date]]  
}

我不能使用这种方法,因为我真的受限于RAM而且这个表每天都在变大。所以我们的目标是使用单个data.table。

2 个答案:

答案 0 :(得分:1)

如果每个Weak只包含一行类型为id的行,则可以执行以下操作:

a

答案 1 :(得分:1)

select varchar_format(current timestamp, 'MM/DD/YYYY') from sysibm.sysdummy1 ; 能做到这一点吗?

first(temp_date)