Добавить третий столбец к фрейму данных на основе значений в двух существующих столбцах - PullRequest
0 голосов
/ 28 августа 2018

У меня есть такой же фрейм данных, где есть несколько наблюдений для каждого состояния в течение 4 кварталов.

df <- data.frame(states=rep(c("AL","AR","FL","GA","LA","MS","NC","OK","SC","TN","TX"), times = 4),
qtr=rep(c(1,2,3,4), times = 11))

Теперь я хочу добавить третий столбец, в котором каждому состоянию присваивается одно значение для qtr 1 и 2 и другое значение для кварталов 3 и 4. Я хочу, чтобы результат выглядел следующим образом:

state qtr unemp
AL    1   4.4
AL    2   4.4
AL    3   4.1
AL    4   4.1 
AR    1   3.7 
AR    2   3.7 
AR    3   3.9
AR    4   3.9

Я надеюсь, что картина ясна. Я попробовал это

df$unemp <- ifelse(df$qtr <3 & df$states %in% "AL",4.4,4.1)

но я не знаю, как добавить к нему больше аргументов. Это только создало столбец незанятости, но не соответствует аргументам.

1 Ответ

0 голосов
/ 28 августа 2018

Как указано в комментариях, лучше приводить воспроизводимые примеры, имитирующие ваши данные. То, что вы хотите сделать - это соединение после некоторой манипуляции с данными (объедините первые два qtr в класс, то же самое для двух последних).

library(dplyr)
df <- data.frame(states=rep(c("AL","AR","FL","GA","LA","MS","NC","OK","SC","TN","TX"), times = 4),
                 qtr=rep(c(1,2,3,4), times = 11))

df <- df %>% arrange(states, qtr) # pure cosmetics
df <- df %>% mutate(sem=ifelse(qtr <= 2, 1, 2),    # merge the first two and the last two
                    key=paste0(states, "_", sem))  # create a joining key


head(df)
states qtr sem  key
1     AL   1   1 AL_1
2     AL   2   1 AL_1
3     AL   3   2 AL_2
4     AL   4   2 AL_2
5     AR   1   1 AR_1
6     AR   2   1 AR_1

# recreate an external source
ext <- df %>% select(states, sem) %>% distinct()

set.seed(123) # for the sake of reproductibility
ext$unemp <- runif(nrow(ext)/2) # simulate some unemp rates
# you probably have something that looks like this:
head(ext)
states sem     unemp
1     AL   1 0.2875775
2     AL   2 0.7883051
3     AR   1 0.4089769
4     AR   2 0.8830174
5     FL   1 0.9404673
6     FL   2 0.0455565

# recreate a key column
ext <- mutate(ext, key=paste0(states, "_", sem))

# have a look at it
head(ext)
states sem     unemp  key
1     AL   1 0.2875775 AL_1
2     AL   2 0.7883051 AL_2
3     AR   1 0.4089769 AR_1
4     AR   2 0.8830174 AR_2
5     FL   1 0.9404673 FL_1
6     FL   2 0.0455565 FL_2

# left join and drop redundant columns
df2 <- left_join(df, ext, "key") %>% 
  transmute(states=states.x, qtr, unemp)

head(df2)
states qtr     unemp
1     AL   1 0.2875775
2     AL   2 0.2875775
3     AL   3 0.7883051
4     AL   4 0.7883051
5     AR   1 0.4089769
6     AR   2 0.4089769

Это то, что вы искали?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...