如何在具有多个条件的r中使用ifelse将另一个变量更改为NA

时间:2019-08-20 16:59:48

标签: r if-statement

我有年份和降雨量的站点数据。我正在尝试将某些年份的特定站点转换为降雨的缺失值(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"

有人知道我在哪里错吗?

2 个答案:

答案 0 :(得分:3)

分配应该在ifelse

之外
df$RAIN <- ifelse(df$STATION==1 & df$YEAR==2001, NA, df$RAIN)

此外,如果不包装with

,则与其重复'df $',也将容易得多。
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_elseifelse不同,它保留类型并且速度更快。