如何根据

时间:2015-06-15 19:27:40

标签: r data.table

背景

我有一些财务数据(1。5年SP500股票),我使用data.table包操作了一个宽格式。在关注Datacamp的整个data.table课程后,我开始掌握基础知识,但在搜索了几个小时后,我对如何做到这一点感到茫然。

问题

数据包含每个股票的财务数据列。我需要删除包含两个连续 NA 的列。

我的猜测是我必须使用rle()lapply()来查找连续值和DT[,x:= NULL])以删除列。

我认为rle()无法处理 NA ,因此我将其更改为 Inf 。 我只是不知道如何组合这些功能,以便我可以有效地删除460中的几列。

使用data.table的答案会很棒,但是非常有用。

或者我很想知道如何删除包含至少1个NA的列

示例数据

> test[1:5,1:5,with=FALSE]
         date     10104     10107     10138     10145
1: 2012-07-02  0.003199       Inf  0.001112 -0.012178
2: 2012-07-03  0.005873  0.006545  0.001428       Inf
3: 2012-07-05       Inf -0.001951 -0.011090       Inf
4: 2012-07-06       Inf -0.016775 -0.009612       Inf
5: 2012-07-09 -0.002742 -0.006129 -0.001294  0.005830
> dim(test)
[1] 377 461

期望的结果

         date     10107     10138
1: 2012-07-02       Inf  0.001112
2: 2012-07-03  0.006545  0.001428
3: 2012-07-05 -0.001951 -0.011090
4: 2012-07-06 -0.016775 -0.009612
5: 2012-07-09 -0.006129 -0.001294

PS。这是我的第一个问题,我试图遵守规则,如果我需要更改任何内容,请告诉我。

4 个答案:

答案 0 :(得分:4)

这是rle版本:

dt[, sapply(dt, function(x)
       setDT(rle(is.na(x)))[, sum(lengths > 1 & values) == 0]), with = F]

如果您愿意,可以将is.na替换为is.infinite

答案 1 :(得分:2)

要检测并删除包含至少一个NA的列,您可以尝试以下

data = data.frame(A=c(1,2,3,4,5), B=c(2,3,4,NA,6), C=c(3,4,5,6,7), D=c(4,5,NA,NA,8))

colsToDelete = lapply(data, FUN = function(x){ sum(is.na(x)) >= 1 })

data.formatted = data[,c(!unlist(colsToDelete))]

答案 2 :(得分:1)

显然问题是找不到连续。 首先,根据缺失的TRUE/FALSE创建矩阵NA。使用该矩阵将每行与下一行进行比较。将列保留在colSums == 0

的原始矩阵中

试试这个:

Missing.Mat <- apply(test, 2, is.na)
Consecutive.Mat <- Missing.Mat[-nrow(Missing.Mat),] * Missing.Mat[-1,]
Keep.Cols <- colSums(Consecutive.Mat) == 0

test[,Keep.Cols]

答案 3 :(得分:0)

这就是我想出的。它会在rle的{​​{1}}向量上调用y,除非该列的对应元素为1:length(column),在这种情况下,y中的对应值为零。然后检查是否有任何运行大于1。

Inf

请注意,列名前面带有&#34; X&#34; keep <- c(date = T, apply(dat[, -1], 2, function(x) { y <- 1:length(x) y[!is.finite(x)] <- 0 return(!any(rle(y)$lengths > 1)) })) dat2 <- dat[, keep] dat2 # date X10107 X10138 # 1 2012-07-02 Inf 0.001112 # 2 2012-07-03 0.006545 0.001428 # 3 2012-07-05 -0.001951 -0.011090 # 4 2012-07-06 -0.016775 -0.009612 # 5 2012-07-09 -0.006129 -0.001294

现在,数据的输入:

read.table