用 NA 替换数据框中的值时出错
Error when replacing a value in a data frame with NAs
说我有这个数据框 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<-"
为了简短起见,我会使用:
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)
第一个问题是正确指定变量名称,即名称而不是值(可能只是您问题中的错字):"y"
而不是 "yes"
。
然后当你使用 ==
时会出现另一个问题,它会尝试考虑如何处理第三行的 NA
:
x=="NS"
[1] TRUE TRUE NA
嗯,留还是不留?它既不是 TRUE
也不是 FALSE
... 所以它只是给出一个错误,因为它不能 "decide".
同时,使用 %in%
(实际上是 match(x, table, nomatch = 0)
),我们得到:
x %in% "NS"
[1] TRUE TRUE FALSE
好了,NA
与值 "NS"
不匹配,所以它是 returns 0,或者,在 logical
,FALSE
中:我们不应该保留它。
因此,得到你想要的:
z[z$x %in% "NS", "y"] <- "a"
z
# x y
#1 NS a
#2 NS a
#3 <NA> b
为什么不这么简单:
z[!is.na(z$x=="NS") & z$y=="yes", "y"] <- "a"
# x y
# 1 NS a
# 2 NS a
# 3 <NA> b
说我有这个数据框 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<-"
为了简短起见,我会使用:
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)
第一个问题是正确指定变量名称,即名称而不是值(可能只是您问题中的错字):"y"
而不是 "yes"
。
然后当你使用 ==
时会出现另一个问题,它会尝试考虑如何处理第三行的 NA
:
x=="NS"
[1] TRUE TRUE NA
嗯,留还是不留?它既不是 TRUE
也不是 FALSE
... 所以它只是给出一个错误,因为它不能 "decide".
同时,使用 %in%
(实际上是 match(x, table, nomatch = 0)
),我们得到:
x %in% "NS"
[1] TRUE TRUE FALSE
好了,NA
与值 "NS"
不匹配,所以它是 returns 0,或者,在 logical
,FALSE
中:我们不应该保留它。
因此,得到你想要的:
z[z$x %in% "NS", "y"] <- "a"
z
# x y
#1 NS a
#2 NS a
#3 <NA> b
为什么不这么简单:
z[!is.na(z$x=="NS") & z$y=="yes", "y"] <- "a"
# x y
# 1 NS a
# 2 NS a
# 3 <NA> b