如果Statement检查多个列并返回新列的值

时间:2014-06-20 19:14:55

标签: r if-statement

我的矩阵包含四列,另一个矩阵包含相同的四列。第一个是每年的每日最高金额以及它发生的月份和日期。第二个有一年,一个月和一天,在我的场地附近经过热带气旋及其引起的最大降雨量(SI_SP_MAX)。我想在rain.max中创建一个与最大值相关的第五列。我希望这个列由0和1组成。 1表示热带气旋是否导致给定年份的每日最大值,如果不是则表示0。我尝试使用if else语句执行此操作,但第五列仅包含0。我需要检查年,月和日,不知道如何去做。 前几行数据是:

rain.max

     Year Month Day Max_mm
     1941     1   4   86.4
     1942     2  11  115.8
     1943     3   5  148.3
     1944     3   8   61.5
     1945     1   9   61.7

SI_SP_MAX

      Year Month Day Max_mm Basin
      1942     2  11  115.8    SI
      1943     3   5  148.3    SI
      1944     3   8   61.5    SI
      1948     4  11  106.9    SI
      1953     1   2  105.4    SI

由于

2 个答案:

答案 0 :(得分:1)

这是一种可能性:

首先我们使用merge来匹配信息:

temp <- merge(rain.max, SI_SP_MAX, by=c("Year", "Month", "Day"), all.x=TRUE)
#  Year Month Day Max_mm.x Max_mm.y Basin
#1 1941     1   4     86.4       NA  <NA>
#2 1942     2  11    115.8    115.8    SI
#3 1943     3   5    148.3    148.3    SI
#4 1944     3   8     61.5     61.5    SI
#5 1945     1   9     61.7       NA  <NA>

然后我们比较列:

rain.max$cyclone <- temp$Max_mm.x == temp$Max_mm.y
rain.max$cyclone[is.na(rain.max$cyclone)] <- FALSE
#  Year Month Day Max_mm cyclone
#1 1941     1   4   86.4   FALSE
#2 1942     2  11  115.8    TRUE
#3 1943     3   5  148.3    TRUE
#4 1944     3   8   61.5    TRUE
#5 1945     1   9   61.7   FALSE

如果您愿意,可以在之后将逻辑值转换为整数,但我不推荐它。

答案 1 :(得分:0)

尝试

rain.max <- structure(list(Year = 1941:1945, Month = c(1L, 2L, 3L, 3L, 1L
), Day = c(4L, 11L, 5L, 8L, 9L), Max_mm = c(86.4, 115.8, 148.3, 
61.5, 61.7)), .Names = c("Year", "Month", "Day", "Max_mm"), class = "data.frame",  row.names = c(NA, -5L))

SI_SP_MAX <- structure(list(Year = c(1942L, 1943L, 1944L, 1948L, 1953L), Month = c(2L, 
3L, 3L, 4L, 1L), Day = c(11L, 5L, 8L, 11L, 2L), Max_mm = c(115.8, 
148.3, 61.5, 106.9, 105.4), Basin = structure(c(1L, 1L, 1L, 1L, 
1L), .Label = "SI", class = "factor")), .Names = c("Year", "Month", 
"Day", "Max_mm", "Basin"), class = "data.frame", row.names = c(NA, 
-5L))

library(plyr)
subset(
   transform(
           join(rain.max, SI_SP_MAX, by=c("Year", "Month", "Day", "Max_mm"), type="left"),
              indx_max=(!is.na(Basin))+0), 
                              select=-Basin)

library(dplyr)
left_join(rain.max, SI_SP_MAX, by=c("Year","Month","Day", "Max_mm"))%>% 
mutate(indx_max=(!is.na(Basin))+0) %>%
select(-Basin)