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