简体   繁体   中英

How can I add rows of a dataframe into columns of another

I have 2 dataframes. One is an empty dataframe called euro_adj:

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

And another one called to_add that I want to "append" into this empty dataframe. The first row is EUR and the second row is USD.

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

Eventually I want this final 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  

I tried this

  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)

but it didn't work since the empty data frame only has 1 row right now. I figure I have to use rbind or something but I don't know how.

If I understood it right, you could use function 'gather()' of tidyr and so use within() function of base .

Check if it solve your problem:

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

Wich gives:

   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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM