R: создать новую переменную, равную конкретным наблюдениям другой переменной (определенные годы)

#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