如何从数据帧的子集中删除值
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。希望对您有帮助。
以上是关于如何从数据帧的子集中删除值的主要内容,如果未能解决你的问题,请参考以下文章
如何通过闪亮的 selectInput 动态选择数据帧的子集?