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

根据R中的条件删除多个列并替换dataframe列的值,r,if-statement,filter,dataframe,R,If Statement,Filter,Dataframe,我有一个巨大的数据框,有4998列,列标题是公司的名称。这些列包含股票价格作为列中的值。所以,我想删除股价(列中的值)小于1的低价股。所以,如果它的值小于1,我想删除整个列。此外,数据框中有一些列的值波动,它们在1以下,但随后又等于或大于1,在本场景中,我希望在该列中,当值低于1时,将其替换为NA。我提到了“用另一列中的值替换数据帧多列中的多个值”,但我的情况有所不同。 我演示了数据帧的一小部分 df1 <- Price Date A B C

我有一个巨大的数据框,有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

df1我将使用两步方法。首先,您可以通过以下方式将低于1的所有值替换为
NA
df1$Column[df1$Column<1]我将使用两步方法。首先,您可以用
NA
替换1以下的所有值,方法如下:
df1$Column[df1$Column<1]这里有一个类似的方法(可能更矢量化了?)

这里有一个类似的方法(也许更矢量化了?)



如果您将数据转换为更具逻辑性的数据结构,即将列数减少到3:“日期”、“公司名称”、“股票价格”,那么您的数据管理(包括执行您描述的任务)是否会容易得多?在这种情况下,您想要实现的任务非常简单。虽然你不需要这样做来找到你的解决方案,但它会使你的R代码更简单和灵活(例如,轻松添加新公司)。@Pete855217谢谢你的建议。我有3914行,所以当我融化数据时,我有内存空间问题。有这么多行是一个问题还是我遗漏了什么?无论使用哪种结构,内存需求大致相同。以这种方式构建数据库的另一个好处是,在处理列/数据时不需要删除列/数据,并且如果将触发器(1便士/美分)等参数更改为标记删除,则不必重新加载(昂贵的)数据文件。R的一个优点是,它允许在运行脚本时进行高水平的数据结构操作,这是使用其他过程语言更难实现的@Pete855217我运行了几次melt,但R无法完成操作。好的,看到问题,可以理解你为什么这样做!如果您将数据转换为更具逻辑性的数据结构,即将列数减少到3:“日期”、“公司名称”、“股票价格”,那么您的数据管理(包括执行您描述的任务)是否会容易得多?在这种情况下,您想要实现的任务非常简单。虽然你不需要这样做来找到你的解决方案,但它会使你的R代码更简单和灵活(例如,轻松添加新公司)。@Pete855217谢谢你的建议。我有3914行,所以当我融化数据时,我有内存空间问题。有这么多行是一个问题还是我遗漏了什么?无论使用哪种结构,内存需求大致相同。以这种方式构建数据库的另一个好处是,在处理列/数据时不需要删除列/数据,并且如果将触发器(1便士/美分)等参数更改为标记删除,则不必重新加载(昂贵的)数据文件。R的一个优点是,它允许在运行脚本时进行高水平的数据结构操作,这是使用其他过程语言更难实现的@Pete855217我运行了几次melt,但R无法完成操作。好的,看到问题,可以理解你为什么这样做!谢谢你,这是一个非常简单的案例。代码工作完美!是否可以知道已从数据帧中删除的列的名称?我真的很感激。可以做
names(df)[colSums(is.na(df))==nrow(df)]
。或者将新数据集的名称与旧数据集的名称进行比较,例如
setdiff(名称(df),名称(df2))
(如果
df2
是新数据集)。谢谢您的回答。我能不能形成一个向量,即
diff\u cols是的。只需
df[diff_cols]
将生成仅包含这些列的数据集。或者类似地,
df[names(df2)]
将生成一个列与
df2
中列相同的数据集。感谢您使用非常简单的方法处理这个案例。代码工作完美!是否可以知道已从数据帧中删除的列的名称?我真的很感激。可以做
names(df)[colSums(is.na(df))==nrow(df)]
。或者将新数据集的名称与旧数据集的名称进行比较,例如
setdiff(名称(df),名称(df2))
(如果
df2
是新数据集)。谢谢您的回答。我能不能形成一个向量,即
diff\u cols是的。只需
df[diff_cols]
将生成仅包含这些列的数据集。或者类似地,
df[names(df2)]
将产生与
df2
中列相同的数据集。是否可以知道已从数据帧中删除的列的名称?我真的很感激。类似于
colnames(df1)[c(FALSE,!keepColumns)]
?可以知道从数据帧中删除的列的名称吗?我真的很感激。类似于
colnames(df1)[c(FALSE,!keepColumns)]
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
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
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