使用NA替换数据框中的值时出错

时间:2016-09-16 09:51:43

标签: r dataframe na

说我有这个数据框z

x <- c("NS","NS",NA) 
y <- c("yes","yes","b") 
z <- as.data.frame(cbind(x,y), stringsAsFactors=FALSE)

> z
     x   y
1   NS yes
2   NS yes
3 <NA>  b

我只想将包含"yes"元素的值更改为"a"。如果我这样做,我会收到一个错误:

z[z$x=="NS","yes"]<-"a"
Error in `[<-.data.frame`(`*tmp*`, z$x == "NS", "yes", value = "a") : 
  missing values are not allowed in subscripted assignments of data frames

由于某种原因,即使我只按"NS"进行了子集,我也会使用NA获取数据帧。如果我删除NA,我会收到另一个错误:

na.omit(z[z$x=="NS","a"])<-"no"
Error in na.omit(z[z$x == "NS", "a"]) <- "no" : 
  could not find function "na.omit<-"

3 个答案:

答案 0 :(得分:2)

第一个问题是正确指定变量名称,即名称而不是值(可能只是问题中的拼写错误):"y"而不是"yes"

当您使用==并尝试考虑如何处理第三行中的NA时,会出现另一个问题:

x=="NS"
[1] TRUE TRUE   NA
嗯,它应该保存还是不保存?它既不是TRUE也不是FALSE ...所以它只是给出了一个错误,因为它无法“决定”。

使用%in%(实际上是match(x, table, nomatch = 0))时,我们得到:

x %in% "NS"
[1]  TRUE  TRUE FALSE

你走了,NA与价值"NS"不匹配,所以它返回0,或者在logicalFALSE:我们不应该保留它。

因此,要得到你想要的东西:

z[z$x %in% "NS", "y"] <- "a"
z
#     x y
#1   NS a
#2   NS a
#3 <NA> b

答案 1 :(得分:0)

为了缩短它,我会使用:

x <- c("NS","NS",NA) 
y <- c("yes","yes","b") 
z <- as.data.frame(cbind(x,y))

z[, c('y')] <- ifelse(y == 'yes', 'a', y)

答案 2 :(得分:0)

为什么不这么简单:

z[!is.na(z$x=="NS") & z$y=="yes", "y"] <- "a"

#      x y
# 1   NS a
# 2   NS a
# 3 <NA> b