我想用字符串值替换数据框中列中的所有数值。以下似乎不起作用。
df <- within(df, myCol[is.numeric(myCol)] <- 'NOTMISSING')
尽管 df 有一些值为 NA,而另一些值为数字,但所有值都被替换为 NOTMISSING。
也试过
df <- within(df, myCol[is_numeric(myCol)] <- 'NOTMISSING')
任何指针高度赞赏。
我想用字符串值替换数据框中列中的所有数值。以下似乎不起作用。
df <- within(df, myCol[is.numeric(myCol)] <- 'NOTMISSING')
尽管 df 有一些值为 NA,而另一些值为数字,但所有值都被替换为 NOTMISSING。
也试过
df <- within(df, myCol[is_numeric(myCol)] <- 'NOTMISSING')
任何指针高度赞赏。
从以下文档is.numeric:
is.numeric 的默认方法返回 TRUE,如果其参数是模式“numeric”(类型 > “double”或类型“integer”)而不是因子,否则返回 FALSE。
所以对于一个向量,is.numeric返回一个单一的TRUE,它不会像你期望的那样测试每个元素。
is.numeric(c(5, 4, 3))
[1] TRUE
is.numeric(c(5, 4, NA))
[1] TRUE
这就是为什么所有或没有值都更改为 NOTMISSING 的原因。
@eg-r 的修复是正确的。这是完成相同任务的一种tidyverse方法。
> df<-tibble(myCol=c(5, 4, NA))
> df
# A tibble: 3 x 1
myCol
<dbl>
1 5
2 4
3 NA
> df %>% mutate(myCol = ifelse(is.na(myCol), myCol, "NOTMISSING"))
# A tibble: 3 x 1
myCol
<chr>
1 NOTMISSING
2 NOTMISSING
3 <NA>
NA 可以是数字(特别是如果该列中的其他值都是数字)。试试这个 :
df$myCol = ifelse(is.numeric(df$myCol) & !is.na(df$myCol), "NOTMISSING", df$myCol)
或者,如果您只想将该列中所有非 NA 值作为该字符串,您可以将原始代码更改为:
df <- within(df, myCol[!is.na(myCol)] <- 'NOTMISSING')