我有一个数据帧,mydata,构造如下:
col1<-c(8.20e+07, 1.75e+08, NA, 4.80e+07,
3.40e+07, NA, 5.60e+07, 3.00e+06 )
col2<-c(1960,1960,1965,1986,1960
,1969,1960,1993)
col3<-c ( NA,2.190,NA,NA, 5.000, NA,
1.700,4.220)
mydata<-data.frame(col1,col2,col3)
mydata
# col1 col2 col3
# 1 8.20e+07 1960 NA
# 2 1.75e+08 1960 2.19
# 3 NA 1965 NA
# 4 4.80e+07 1986 NA
# 5 3.40e+07 1960 5.00
# 6 NA 1969 NA
# 7 5.60e+07 1960 1.70
# 8 3.00e+06 1993 4.22
Run Code Online (Sandbox Code Playgroud)
我想创建一个col4具有值的值"a", "b" and "c",如果col1小于4.00e + 07,那么col4=="a"; 如果col1不小于4.00e + 07,那么col4=="b",col4=="c"
这是我的代码:
col4 <-ifelse(col1<4.00e+07, "a",
ifelse(col1 >=4.00e+07, "b",
ifelse(is.na(col1 =4.00e+07), "b", "c" )))
Run Code Online (Sandbox Code Playgroud)
但这评估为:
# [1] "b" "b" NA "b" "a" NA "b" "a"
Run Code Online (Sandbox Code Playgroud)
它不会将col1中的NA值更改为"c".
结果应该是:
# [1] "b" "b" "c" "b" "a" "c" "b" "a"
Run Code Online (Sandbox Code Playgroud)
我的代码有什么问题?任何建议将不胜感激!
你必须先检查is.na,因为NA < 4.00e+07结果NA.如果第一个参数ifelse()是NA,结果NA也是如此:
ifelse(c(NA, TRUE, FALSE), "T", "F")
## [1] NA "T" "F"
Run Code Online (Sandbox Code Playgroud)
如您所见,对于第一个向量元素,结果确实如此NA.即使其他参数ifelse()具有可以处理这种情况的特殊代码,也无济于事,因为该代码永远不会被考虑在内.
对于您的示例,先检查会为NA您提供所需的结果:
col4 <- ifelse(is.na(col1), "c",
ifelse(col1 < 4.00e+07, "a","b"))
col4
## [1] "b" "b" "c" "b" "a" "c" "b" "a"
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3016 次 |
| 最近记录: |