#r #left-join #dplyr
#r #левое соединение #dplyr
Вопрос:
У меня есть панельные данные по странам: https://docs.google.com/spreadsheets/d/1ZB5po_f9srk-u8OGTA6O5P23XtbZCUGyjrLU6I2glrg/edit?usp=sharing
в основном:
country year x y z
a 1991 ## ## ##
b 1991 ## ## ##
c 1991 ## ## ##
d 1991 ## ## ##
a 1992 ## ## ##
b 1992 ## ## ##
Я хочу создать новую переменную, основанную на значениях страны c для переменной x, повторяющихся для всех наблюдений…в идеале что-то вроде:
country year x y z new
a 1991 ## ## ## 1
b 1991 ## ## ## 1
c 1991 1 ## ## 1
d 1991 ## ## ## 1
a 1992 ## ## ## 2
b 1992 ## ## ## 2
c 1992 2 ## ## 2
Я создал переменные, используя mutate, и в настоящее время у меня есть что-то вроде:
df <- df %>%
mutate(new = country %in% ifelse("c", x, )
Но я не могу найти правильный синтаксис. Если есть какие-либо предложения, я был бы очень признателен.
Сначала я попытался создать новый фрейм данных и использовать left_join; однако это создало кучу новых наблюдений. Если это вариант, мне тоже было бы интересно.
Спасибо!
Обновить:
Я смог устранить обходной путь с помощью:
Panel <- Panel %>%
mutate(China_NGDP_bnYuan1 = ifelse(Country == "China", Nominal_gdp, 0)) %>%
group_by(Year) %>%
mutate(China_NGDP_bnYuan = sum(China_NGDP_bnYuan1, na.rm = TRUE)) %>%
ungroup()
хотя, могут быть некоторые более чистые способы достижения того же результата.
2-е ОБНОВЛЕНИЕ Похоже, я могу получить желаемый результат, также используя join
Сначала создаем новый df только со значениями страны c.:
c_x <- df %>%
filter(Country == "c")
c_x <- c_x %>% select(Year, x)
затем с помощью left_join:
library(tidyverse)
library(dplyr)
newdf <- left_join(df, c_x, by = "Year")
Ответ №1:
Мы могли бы использовать fill
. Если ##
они находятся NA
в столбце ‘x’, затем сгруппируйте по ‘year’ и fill
столбцу с .direction
указанным значением «updown»
library(dplyr)
library(tidyr)
df %>%
mutate(new = x) %>%
group_by(year) %>%
fill(new, .direction = "updown")
Комментарии:
1. Привет, спасибо за ответ; однако, похоже, это дает мне переменную x для всех стран и лет и не указывает, что я ищу только значения ‘x’, где country == ‘c’ , а затем сопоставляю их с годами. Я должен указать, что ## s представляют различные числа.
Ответ №2:
Вы можете arrange
обрабатывать данные с помощью year
и country
и увеличивать счетчик каждый раз, когда встречается первое значение в данных.
library(dplyr)
Panel %>%
arrange(year, country) %>%
mutate(new = cumsum(country == first(country))) -> Panel
Panel