删除多个列并根据R中的条件替换dataframe列的值

时间:2016-01-03 13:25:21

标签: r if-statement filter dataframe

我有一个包含4998列的庞大数据框,列标题是公司的名称。这些列包含股票价格作为列中的值。因此,我想删除股票价格(列中的值)小于1的便士股票。因此,如果其值小于1,我想删除整个列。此外,数据框中有列,其中值波动他们低于1,但然后返回等于或大于1,在这个场景中,我希望在此列中,当值低于1时,它将被NA替换。我已经提到'将多个数据帧列中的多个值替换为另一列中的值',但我的情况略有不同。 我举例说明了数据框的一小部分

df1 <- Price
     Date        A   B       C
    01/01/2000  NA  0.03    0.95
    02/01/2000  NA  0.03    0.95
    03/01/2000  NA  0.03    0.95
    04/01/2000  NA  0.03    0.95
    05/01/2000  5   0.03    0.95
    06/01/2000  6   0.5       1
    07/01/2000  7   0.5       1
    08/01/2000  8   0.5       NA
    09/01/2000  9   0.5       NA

所需的输出数据帧

df2<- df1
Date        A   C
01/01/2000  NA  NA
02/01/2000  NA  NA
03/01/2000  NA  NA
04/01/2000  NA  NA
05/01/2000  5   NA
06/01/2000  6   NA
07/01/2000  7   1
08/01/2000  8   1
09/01/2000  9   NA

非常感谢您的帮助。

2 个答案:

答案 0 :(得分:5)

这是一种类似的方法(可能更加向量化?)

is.na(df[-1]) <- df[-1] < 1 # Convert all values < 1 to NAs.
df[colSums(is.na(df)) != nrow(df)] # Select only the columns that have values.
#         Date  A  C
# 1 01/01/2000 NA NA
# 2 02/01/2000 NA NA
# 3 03/01/2000 NA NA
# 4 04/01/2000 NA NA
# 5 05/01/2000  5 NA
# 6 06/01/2000  6  1
# 7 07/01/2000  7  1
# 8 08/01/2000  8 NA
# 9 09/01/2000  9 NA

或者,第二步可能是

df[c(TRUE, colSums(df[-1], na.rm = TRUE) > 0)]
## OR 
## df[c(TRUE, sapply(df[-1], sum, na.rm = TRUE) > 0)] # as already sugggested

答案 1 :(得分:3)

我会采用两步法。首先,您可以通过以下方式将所有低于1的值替换为NAdf1$Column[df1$Column < 1] <- NA(使用lapply在所有列中执行此操作,如下所示)。接下来,我将删除仅包含NA的所有列:

df1 <- read.table(textConnection("
    Date        A   B       C
    01/01/2000  NA  0.03    0.95
    02/01/2000  NA  0.03    0.95
    03/01/2000  NA  0.03    0.95
    04/01/2000  NA  0.03    0.95
    05/01/2000  5   0.03    0.95
    06/01/2000  6   0.5       1
    07/01/2000  7   0.5       1
    08/01/2000  8   0.5       NA
    09/01/2000  9   0.5       NA"), header=TRUE, stringsAsFactors=FALSE)

df2 <- df1

## replace values below 1 with NA
df2[, -1] <- lapply(df2[, -1], function(y){y[y < 1] <- NA; y})
# $A
# [1] NA NA NA NA  5  6  7  8  9
#
# $B
# [1] NA NA NA NA NA NA NA NA NA
#
# $C
# [1] NA NA NA NA NA  1  1 NA NA
#

## remove all columns where all values are NA but keep the others
keepColumn <- sapply(df2[, -1], function(y)sum(!is.na(y)) > 0)
#     A     B     C
#  TRUE FALSE  TRUE

## keep Date column and all the other with values greater than 1
df2[, c(TRUE, keepColumn)]
#         Date  A  C
# 1 01/01/2000 NA NA
# 2 02/01/2000 NA NA
# 3 03/01/2000 NA NA
# 4 04/01/2000 NA NA
# 5 05/01/2000  5 NA
# 6 06/01/2000  6  1
# 7 07/01/2000  7  1
# 8 08/01/2000  8 NA
# 9 09/01/2000  9 NA