Оператор If для проверки нескольких столбцов и возврата значения для нового столбца

#r #if-statement

#r #if-оператор

Вопрос:

У меня есть матрица, содержащая четыре столбца, и другая матрица, содержащая те же четыре столбца. Первый содержит ежедневную максимальную сумму за каждый год, месяц и день, когда это произошло. Во втором есть год, месяц и день, в который тропический циклон прошел рядом с моим сайтом, и максимальное количество осадков, которое он вызвал (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
  

Спасибо

Ответ №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. > Спасибо, я использовал функцию слияния. Но я сделал это по-другому. > colnames(SI_SP_MAX)=c(«Год», «Месяц», «День», «Max_mm_x», «Бассейн») > temp= merge(rain.max, SI_SP_MAX, by=c(«Год», «Месяц», «День»), all=TRUE)>temp$Basin[is.na (temp$Basin)] = 0 > temp[,7]=1 > имена столбцов (temp)=c(«Год», «Месяц», «День», «Max_mm», «Max_TC», «Basin», «TC»)> temp$TC[is.na (temp$Max_TC)] = 0

2. Извините, я новичок на этом сайте и не знаю, как правильно его добавить.

Ответ №2:

Попробуйте

 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)