我有年份和降雨量的站点数据。我正在尝试将某些年份的特定站点转换为降雨的缺失值(NA)。我希望不是该特定站/年份的所有内容都保持降雨量。
我一直在使用ifelse
来指定多个条件并将降雨量指定为NA。但是每次执行此操作时,我的数据帧都会变成一个值,该值就是不是NA的行数。
以下是一些示例数据:
STATION<-c(1,1,1,2,2,2)
YEAR<-c(2000,2001,2002,2000,2001,2002)
RAIN<-c(5,4,3,4,3,5)
df<-cbind(STATION,YEAR,RAIN)
df<-as.data.frame(df)
现在,如果我想要2001年第一站的降雨量,我将使用以下ifelse语句:
df<-ifelse(df$STATION==1&&df$YEAR==2001,df$RAIN<-"NA",df$RAIN<-df$RAIN)
使用此代码,df的值为5。
我想要得到的是一个看起来像这样的数据框:
STATION YEAR RAIN
[1,] "1" "2000" "5"
[2,] "1" "2001" "NA"
[3,] "1" "2002" "3"
[4,] "2" "2000" "4"
[5,] "2" "2001" "3"
[6,] "2" "2002" "5"
有人知道我在哪里错吗?
答案 0 :(得分:3)
分配应该在ifelse
df$RAIN <- ifelse(df$STATION==1 & df$YEAR==2001, NA, df$RAIN)
此外,如果不包装with
df$RAIN <- with(df, ifelse(STATION == 1 & YEAR == 2001, NA, RAIN))
df
# STATION YEAR RAIN
#1 1 2000 5
#2 1 2001 NA
#3 1 2002 3
#4 2 2000 4
#5 2 2001 3
#6 2 2002 5
注意:除分配外,&&
应该为&
,因为前者仅返回单个TRUE / FALSE作为输出。同样,data.frame(cbind
会弄乱列的类型,因为cbind
首先返回matrix
,而matrix
只能有一个类。
NA
不应被引用。
关于为何仅返回5
的问题,如上所述,&&
返回单个TRUE / FALSE
df$STATION==1&&df$YEAR==2001
#[1] FALSE
在ifelse
中,现在no
部分变为活动状态,“ RAIN”的第一个值为5
ifelse(df$STATION==1&&df$YEAR==2001, NA,df$RAIN) # modified syntax related issues
#[1] 5
这将分配给整个列
df <- data.frame(STATION,YEAR,RAIN)
答案 1 :(得分:1)
您也可以使用dplyr
来达到相同的目的:
library(dplyr)
STATION<-c(1,1,1,2,2,2)
YEAR<-c(2000,2001,2002,2000,2001,2002)
RAIN<-c(5,4,3,4,3,5)
df<-cbind(STATION,YEAR,RAIN)
df<-as.data.frame(df)
df <- df %>% mutate(RAIN = if_else(STATION == 1 & YEAR == 2001, NA, RAIN))
我发现它的语法更加直观。另外,if_else
与ifelse
不同,它保留类型并且速度更快。