R установка значения на основе другого столбца по группе - PullRequest
0 голосов
/ 07 января 2019

У меня есть фрейм данных в R, похожий на приведенный ниже. Я хочу создать новый столбец с именем tfp level[1980], который в 1980 году принимает значение tfp level. С учетом группировки по странам.

Так, например Австралия будет принимать значение 0,796980202 за каждый год, а Коста-Рику - 1,082085967 за каждый год.

country     ISO year    tfp level    tfp level[1980]
Australia   AUS 1980    0.796980202 
Australia   AUS 1981    0.808527768 
Australia   AUS 1982    0.790943801 
Australia   AUS 1983    0.818122745 
Australia   AUS 1984    0.827925146     
Australia   AUS 1985    0.825170755 
Costa Rica  CRI 1980    1.082085967 
Costa Rica  CRI 1981    1.033975005 
Costa Rica  CRI 1982    0.934024811 
Costa Rica  CRI 1983    0.920588791

Должен быть способ решить эту проблему аккуратно с помощью dplyr, например, с помощью команды group_by, но я сам не могу найти хорошее решение.

Спасибо.

1 Ответ

0 голосов
/ 07 января 2019

После группировки по 'стране', mutate, чтобы получить соответствующий 'tfp.level' для значения 'год' 1980

library(dplyr)
df1 %>% 
  group_by(country) %>%
  mutate(tfllevel1980 = `tfp level`[year == 1980])
# A tibble: 10 x 5
# Groups:   country [2]
#   country    ISO    year `tfp level` tfllevel1980
#   <chr>      <chr> <int>       <dbl>        <dbl>
# 1 Australia  AUS    1980       0.797        0.797
# 2 Australia  AUS    1981       0.809        0.797
# 3 Australia  AUS    1982       0.791        0.797
# 4 Australia  AUS    1983       0.818        0.797
# 5 Australia  AUS    1984       0.828        0.797
# 6 Australia  AUS    1985       0.825        0.797
# 7 Costa Rica CRI    1980       1.08         1.08 
# 8 Costa Rica CRI    1981       1.03         1.08 
# 9 Costa Rica CRI    1982       0.934        1.08 
#10 Costa Rica CRI    1983       0.921        1.08 

Или используя base R

df1$tfplevel1980 <- with(df1, ave(`tfp level` * (year == 1980), 
                 country, FUN = function(x) x[x!= 0]))

Данные

df1 <- structure(list(country = c("Australia", "Australia", "Australia", 
"Australia", "Australia", "Australia", "Costa Rica", "Costa Rica", 
"Costa Rica", "Costa Rica"), ISO = c("AUS", "AUS", "AUS", "AUS", 
"AUS", "AUS", "CRI", "CRI", "CRI", "CRI"), year = c(1980L, 1981L, 
1982L, 1983L, 1984L, 1985L, 1980L, 1981L, 1982L, 1983L), 
`tfp level` = c(0.796980202, 
0.808527768, 0.790943801, 0.818122745, 0.827925146, 0.825170755, 
1.082085967, 1.033975005, 0.934024811, 0.920588791)),
class = "data.frame", row.names = c(NA, 
-10L))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...