Как я могу добавить строки кадра данных в столбцы другого - PullRequest
1 голос
/ 26 июня 2019

У меня есть 2 кадра данных.Один из них - пустой фрейм данных с именем euro_adj:

 flow country year frequency currency percentage notes
1   NA      NA   NA        NA       NA         NA    NA

А другой - с именем to_add, который я хочу «добавить» в этот пустой фрейм данных.Первая строка - EUR, а вторая - USD.

1999 2000 2001 2002 
 NA   NA 89.08  NA
 NA   NA  60.2  NA

В конце концов, я хочу получить окончательный вариант df:

flow   country year frequency currency percentage notes
Export Austria 1999   Annual     EUR       NA         NA   
Export Austria 2000   Annual     EUR       NA         NA 
Export Austria 2001   Annual     EUR       89.08      NA 
Export Austria 2002   Annual     EUR       NA         NA 
Export Austria 1999   Annual     USD       NA         NA 
Export Austria 2000   Annual     USD       NA         NA 
Export Austria 2001   Annual     USD      60.2        NA
Export Austria 2002   Annual     USD       NA         NA  

Я пробовал это

  to_add_transpose = as.data.frame(t(to_add))
  colnames(to_add_transpose) = c("EUR", "USD")
  euro_adj$country = rep("Austria", ncol(to_add)*2)
  euro_adj&flow = rep("Exports", ncol(to_add)*2)
  euro_adj$year = rep(1999:2012, 2)
  euro_adj$frequency = rep("Annual", ncol(to_add)*2)
  euro_adj$percentage = c(to_add_trasnpose$EUR, to_add_transpose$USD)

, ноэто не сработало, поскольку пустой фрейм данных сейчас имеет только 1 строку.Я полагаю, что мне нужно использовать rbind или что-то еще, но я не знаю как.

1 Ответ

0 голосов
/ 26 июня 2019

Если я правильно понял, вы можете использовать функцию 'collect ()' tidyr и использовать within() функцию base.

Проверьте, решает ли она вашу проблему:

library(dplyr)
library(tidyr)



# Yours data
to_add = data.frame(a=c(NA,NA),  
                    b=c(NA,NA), 
                    c=c(89.08,60.2),
                    d=c(NA,NA)
) 
colnames(to_add) = c("1999","2000","2001","2002")

# Creating column of "coin"
to_add["coin"] = c("EUR","USD")


# Just numbers of rows and columns
nr = nrow(to_add)
nc = ncol(to_add)-1

# Transforming data, like "transpose"
to_add = gather(data = to_add,"year","value",1:4)


# build another data frame
euro_adj = data.frame(flow=rep("Exports", nc*nr),
                      country=rep("Austria", nc*nr),
                      year=rep(1999:2002, nr),
                      frequency=rep("Annual", nc*nr),
                      # Set curency by order
                      currency= to_add[order(to_add$coin),"coin"],
                      percentage=NA[1:nc*nr],
                      notes=NA[1:nc*nr]
                      )

# set values

set = to_add[!is.na(to_add$value),c("coin","year","value")]

euro_adj = euro_adj %>% 
            within(percentage[year %in% set$year & currency %in% set$coin] <- set$value)

# Print data frame 
euro_adj

Который дает:

   flow country year frequency currency percentage notes
Exports Austria 1999    Annual      EUR         NA    NA
Exports Austria 2000    Annual      EUR         NA    NA
Exports Austria 2001    Annual      EUR      89.08    NA
Exports Austria 2002    Annual      EUR         NA    NA
Exports Austria 1999    Annual      USD         NA    NA
Exports Austria 2000    Annual      USD         NA    NA
Exports Austria 2001    Annual      USD      60.20    NA
Exports Austria 2002    Annual      USD         NA    NA
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...