我有一个有关过去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).
此外,我认为有一种解决该问题的更有效方法。
答案 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))