删除所有行,直到达到特定值为止-对下一组进行相同操作

时间:2019-06-11 08:20:38

标签: r data.table

我有一个有关过去30年股票收益的数据集。现在,我需要删除公司的所有行(年),直到第一行(不是NA)为止。但是我需要将所有其他行留给该公司使用NA,以后可能会发生。然后,代码应跳至下一个公司(Id)并重新启动该过程。

我已经尝试过以下代码,但老实说,我有点迷失了。

cleaning <- function (DT, colnames){
  for(cols in colnames) 
    if(is.na(cols)){
      DT[, cols := NULL]
    } else {
      break
    }
}
MergedDT[, cleaning(MergedDT, RET), by = "Id"]

我收到该代码的以下警告:

> 1: In `[.data.table`(DT, , `:=`(cols, NULL)) :   Adding new column
> 'cols' then assigning NULL (deleting it).

此外,我认为有一种解决该问题的更有效方法。

3 个答案:

答案 0 :(得分:0)

group_by的组合,用于按公司(或本示例中的cyl)和do进行分析,以查找年份(或{{1})的第一个实例})不能使用NA:

mpg

答案 1 :(得分:0)

Iiuc,您正在寻找每个ID的NA起始收益的调整方法,这是一个选择:

DT[-DT[,.I[seq_len(match(TRUE, !is.na(RET)) - 1L)], .(ID)]$V1]

输出:

   ID  RET
1:  1 0.02
2:  1   NA
3:  2 0.01
4:  2   NA
5:  3 0.01
6:  3 0.05
7:  3 0.02

数据:

DT <- data.table(ID=c(1,1,1,2,2,2,2,3,3,3), RET=c(NA,0.02,NA, NA,NA,0.01,NA, 0.01,0.05,0.02))

DT

    ID  RET
 1:  1   NA
 2:  1 0.02
 3:  1   NA
 4:  2   NA
 5:  2   NA
 6:  2 0.01
 7:  2   NA
 8:  3 0.01
 9:  3 0.05
10:  3 0.02

答案 2 :(得分:0)

DT[DT[,  .I[cumsum(!is.na(RET)) > 0], ID]$V1]

   ID  RET
1:  1 0.02
2:  1   NA
3:  2 0.01
4:  2   NA
5:  3 0.01
6:  3 0.05
7:  3 0.02

数据(从chinsoon12( O 原始问题 p oster无法提供可复制的数据)中窃取):

DT <- data.table(ID=c(1,1,1,2,2,2,2,3,3,3), RET=c(NA,0.02,NA, NA,NA,0.01,NA, 0.01,0.05,0.02))