我有一个包含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
非常感谢您的帮助。
答案 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的值替换为NA
:df1$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