#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)