Изменение имени наблюдения с помощью dplyr

Предположим, у меня есть этот набор данных:

Variable <- c("GDP")
Country <- c("Brazil", "Chile") 
df <- data.frame(Variable, Country)

Я хочу изменить ВВП на ВВП "Country_observation", то есть ВВП Бразилии и ВВП Чили.

У меня гораздо больший набор данных, и я пытался сделать это, используя

df %>% mutate(Variable = replace(Variable, Variable == "GDP", paste(Country, "GDP")))

Однако он напечатает первое наблюдение переменной «Страна» для каждого наблюдения в «Переменной», которое удовлетворяет условию. Есть ли способ заставить paste() использовать значение Country в строке, к которой оно применяется?

Я пытался использовать rowwise(), и это не сработало. Я также пробовал следующий код и столкнулся с той же проблемой

df %>% mutate(Country = ifelse(Country == "Chile", replace(Variable, Variable == "GDP", 
paste(Country, "GDP")), Variable))

Спасибо всем!

ИЗМЕНИТЬ

Я не могу просто использовать объединение, потому что мне все еще нужна переменная Country. Итак, обходной путь, который я нашел, был (у меня было несколько других наблюдений, которые мне нужно было изменить их имена)

df %>% mutate(Variable2 = ifelse(Variable == "GDP", paste0(Country, " ",
Variable), Variable)) %>% 
mutate(Variable2 = replace(Variable2, Variable2 ==
"CR", "Country Risk")) %>% 
mutate(Variable2 = replace(Variable2, Variable2 
== "EXR", "Exchange Rate")) %>% 
mutate(Variable2 = replace(Variable2,mVariable2 == "INTR", "Interest Rate")) 
%>% select(-Variable) %>% 
select(Horizon, Variable = Variable2, Response, Low, Up, Shock, Country,
Status)

EDIT 2 Мой желаемый результат был

Horizon   Variable   Response Shock Country
1         Brazil GDP   0.0037  PCOM  Brazil
2         Brazil GDP   0.0060  PCOM  Brazil
3         Brazil GDP   0.0053  PCOM  Brazil
4         Brazil GDP   0.0033  PCOM  Brazil
5         Brazil GDP   0.0021  PCOM  Brazil
6         Brazil GDP   0.0020  PCOM  Brazil

person André Cordeiro Valério    schedule 09.11.2017    source источник
comment
paste выглядит нормально, но без использования replace. Вы также можете использовать unite из пакета tidyr.   -  person AntoniosK    schedule 09.11.2017


Ответы (1)


Этот пример должен помочь:

library(tidyr)
library(dplyr)

Variable <- c("GDP")
Country <- c("Brazil", "Chile") 
value = c(5,10)
df <- data.frame(Variable, Country, value)

# original data
df

#   Variable Country value
# 1      GDP  Brazil     5
# 2      GDP   Chile    10

# update
df %>% unite(NewGDP, Variable, Country)

#       NewGDP value
# 1 GDP_Brazil     5
# 2  GDP_Chile    10

Если вы хотите использовать paste, вы можете сделать:

df %>% mutate(NewGDP = paste0(Country,"_",Variable))

#   Variable Country value     NewGDP
# 1      GDP  Brazil     5 Brazil_GDP
# 2      GDP   Chile    10  Chile_GDP
person AntoniosK    schedule 09.11.2017
comment
Спасибо большое! Ваше предложение дало мне представление о том, как с этим справиться, хотя я думаю, что могут быть лучшие способы решить мою проблему. Дело в том, что с объединением мне все еще нужна переменная Country, поэтому я не могу от нее избавиться. Итак, я создаю Variable2, используя mutate, и после некоторых манипуляций переупорядочиваю ее. - person André Cordeiro Valério; 09.11.2017
comment
Я действительно не понял, что вы хотите получить. Я, наверное, что-то упускаю здесь :-). Можете ли вы опубликовать, как вы хотите, чтобы это выглядело? - person AntoniosK; 09.11.2017
comment
Я сделал редактирование, чтобы вы могли видеть, о чем я думал. Но еще раз, большое спасибо, ваш ответ дал мне представление о том, как решить эту проблему. - person André Cordeiro Valério; 09.11.2017
comment
У Unite есть опция удаления, которую вы можете установить на False и сохранить начальные столбцы. Попытайся. - person AntoniosK; 09.11.2017