Как заменить «Эфиопия» на «Эфиопия (-1992)» и «Эфиопия (1993-)» в зависимости от года - PullRequest
2 голосов
/ 30 июня 2019

Я пытаюсь заменить "Эфиопию" в location_1 на "Эфиопию (-1992)", если location_1 говорит "Эфиопия" и годы соответствуют всем годам до 1992 года включительно и "Эфиопия (1993-) "если location_1 говорит" Эфиопия ", и годы соответствуют всем годам с 1993 года и далее.

К сожалению, код, который я придумал, заменяет все «Эфиопия (-1992)» даже для тех лет после 1992 года.

Ниже приведен код:

if (mydata$year >= 1992) {
  mydata$location_1 <- sub("Ethiopia", "Ethiopia (-1992)", mydata$location_1)
} else mydata$location_1 <- sub("Ethiopia", "Ethiopia (1993-)", mydata$location_1)

Я надеялся, что вся «Эфиопия» превратится в «Эфиопию (-1992)» или «Эфиопию (1993-)» в зависимости от года.Вместо этого результаты таковы, что вся Эфиопия становится Эфиопией (-1992).

Ответы [ 3 ]

2 голосов
/ 30 июня 2019

Вы можете заменить столбец в подмножестве ваших данных:

mydata[which(mydata$location_1=="Ethiopia" & mydata$year <= 1992), 
      "location1"] <- "Ethiopia (-1992)"

mydata[which(mydata$location_1=="Ethiopia" & mydata$year >  1992), 
       "location1"] <- "Ethiopia (1993-)"

Или использовать dplyr:

library(dplyr)
df1 %>% 
  mutate(location_1=case_when(location_1=="Ethiopia" & year <= 1992 ~ "Ethiopia (-1992)",
                              location_1=="Ethiopia" & year > 1992 ~ "Ethiopia (1993-)",
                              TRUE ~ location_1))
0 голосов
/ 30 июня 2019

Вид используемого условия if-else должен находиться в итеративном цикле.A для цикла , например:

for (i in 1:nrow(mydata)){
    if (mydata$location_1[i] == "Ethiopia") {
        if (mydata$year[i] <= 1992) mydata$location_1[i] <- "Ethiopia (-1992)"
        else mydata$location_1[i] <- "Ethiopia (1993-)"
    }
}

#### OUTPUT ####

   year       location_1
1  1994          Germany
2  1998          Germany
3  1993 Ethiopia (1993-)
4  1982          Germany
5  1989            China
6  1997 Ethiopia (1993-)
7  2001            China
8  1990            China
9  1984 Ethiopia (-1992)
10 1999 Ethiopia (1993-)

Вы можете достичь той же цели несколько более компактно (и, возможно, немного быстрее), используя векторизованную функцию ifelse:

mydata$location_1 <- ifelse(mydata$location_1 == "Ethiopia",
       ifelse(mydata$year <= 1992, "Ethiopia (-1992)", "Ethiopia (1993-)"),
       mydata$location_1
       )

Лично я, вероятно, просто создал бы новую переменную с названием страны, за которым следовали бы (-1992) или (1993-).Он синтаксически компактен, сравнительно быстр, и вся информация сохраняется, что может быть полезно для последующего поднабора:

mydata$cy <- paste(mydata$location_1, ifelse(mydata$year <= 1992,
                                             "(-1992)", "(1993-)"
                                             ))

#### OUTPUT ####

   year location_1               cy
1  1994    Germany  Germany (1993-)
2  1998    Germany  Germany (1993-)
3  1993   Ethiopia Ethiopia (1993-)
4  1982    Germany  Germany (-1992)
5  1989      China    China (-1992)
6  1997   Ethiopia Ethiopia (1993-)
7  2001      China    China (1993-)
8  1990      China    China (-1992)
9  1984   Ethiopia Ethiopia (-1992)
10 1999   Ethiopia Ethiopia (1993-)

Данные:

set.seed(123)

mydata <- data.frame(year = sample(1980:2004, 10, T),
                     location_1 = sample(c("Ethiopia", "Germany", "China"), 10, T),
                     stringsAsFactors = F
                     )
0 голосов
/ 30 июня 2019

a data.table подход. data.table - очень быстрый пакет, проверьте ?data.table для деталей:

mydata[location_1 == "Ethiopia" & !is.na(year), 
       location1 := ifelse(year <= 1992, 
                           "Ethiopia (-1992)", 
                           "Ethiopia (1993-)")

Что там:

mydata[location_1 == "Ethiopia" & !is.na(year), фильтрует все строки, в которых location_1 - это Эфиопия, и есть год (мы не хотим ошибочно назначать имя для недоступных лет).

location1 := является вызовом присваивания (:= является оператором присваивания)

ifelse(year <= 1992, x, y) возвращает x, если условие ИСТИНА, и y в противном случае.

...