如何从数据帧的子集中删除值

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何从数据帧的子集中删除值相关的知识,希望对你有一定的参考价值。

我有一个大数据框。我想替换基于数据子集的值。

 dat <- data.frame(col1 = c("A", "A", "B", "B"),
                 col2 = c(50, 100, 200, 250))

对于col1 = A,我想用NA替换超过75的任何值

对于col1 = B,我想用NA替换超过210的任何值

我尝试过:

if(dat$col1 == "A") { dat$col1 <- ifelse(dat$col1 > 75, NA, dat$col1) }

我收到以下警告:警告消息:

1: In if (dat$col1 == "A") { :
the condition has length > 1 and only the first element will be used
2: In Ops.factor(dat$col1, 75) : ‘>’ not meaningful for factors
答案

警告消息已经给您一些提示。第一条消息告诉您该条件被要求提供多个值。那是因为您要指定整个列。第二条消息告诉您,对于因子使用>之类的条件是没有意义的。

第二个问题来自DF的构建方式。通过添加stringsAsFactors = FALSE,您可以避免col1自动成为因素:

(dat <- data.frame(col1 = c("A", "A", "B", "B"), col2 = c(50, 
    100, 200, 250), stringsAsFactors = F))
#>   col1 col2
#> 1    A   50
#> 2    A  100
#> 3    B  200
#> 4    B  250

reprex package(v0.3.0)在2020-01-21创建

如果要使用已编写的If序列,则必须索引,以便检查列中的每一行。可以这样做:

for ( i in seq_along(dat$col1)){
  dat$col1[i]<- ifelse(dat$col2[i] > 75, NA, dat$col1[i]) 
}
dat
#>   col1 col2
#> 1    A   50
#> 2 <NA>  100
#> 3 <NA>  200
#> 4 <NA>  250

我稍稍更改了一下,以便检查col2是否大于75,而不是col1,其中包含字符。

可能那不是您想要的。假设如果要在col2中将所有值替换为NA,则将col1 == "A"col2 > 75替换为所有值,而在col2中将所有值替换为NA,如果将col1 == "B"col2 > 210替换为一个更好的方法实现您想要的是:

dat <- data.frame(col1 = c("A", "A", "B", "B"),
                  col2 = c(50, 100, 200, 250),
                  stringsAsFactors = F)
dat$col2 <- ifelse(dat$col1 == 'A' & dat$col2 > 75, NA, dat$col2)
dat$col2 <- ifelse(dat$col1 == 'B' & dat$col2 > 210, NA, dat$col2)
dat
#>   col1 col2
#> 1    A   50
#> 2    A   NA
#> 3    B  200
#> 4    B   NA

reprex package(v0.3.0)在2020-01-21创建

在这里,您要根据两个条件来更改col2。希望对您有帮助。

以上是关于如何从数据帧的子集中删除值的主要内容,如果未能解决你的问题,请参考以下文章

如何从 R 中的数据帧的开头和结尾删除 NA?

根据R中单元格的值构建的数据帧的子集的列表

如何通过闪亮的 selectInput 动态选择数据帧的子集?

使用多索引上的条件选择数据帧的子集

如何使用 Google TextRecognizer 或 Tesseract 在相机帧的子集上执行 OCR

根据时间频率将特定函数应用于数据帧的某个子集