2015-11-30 31 views
4

我有以下data.frame移调在dplyr

df = structure(list(HEADER = c("HOME_TRPM", "AWAY_TRPM", "HOME_TEAM","AWAY_TEAM"), 
        price = c("0.863104076023855", "-0.845186446996287","CHA", "NOP")), 
       .Names = c("HEADER", "price"), row.names = c(NA, 4L), class = "data.frame") 

df 
#>  HEADER    price 
#> 1 HOME_TRPM 0.863104076023855 
#> 2 AWAY_TRPM -0.845186446996287 
#> 3 HOME_TEAM    CHA 
#> 4 AWAY_TEAM    NOP 

,我要转。如何在不使用t()的情况下在dplyr中执行此操作?我试图

df %>% tidyr::spread(HEADER , price) 

,但它没有给出一个平面结构,而是做到这一点:

structure(list(AWAY_TEAM = c(NA, NA, NA, "NOP"), 
    AWAY_TRPM = c(NA, "-0.845186446996287", NA, NA), 
    HOME_TEAM = c(NA, NA, "CHA", NA), 
    HOME_TRPM = c("0.863104076023855", NA, NA, NA)), 
.Names = c("AWAY_TEAM", "AWAY_TRPM", "HOME_TEAM", "HOME_TRPM"), 
class = "data.frame", row.names = c(NA, 4L)) 

产生的data.frame应该是这样的:

structure(list(HOME_TRPM = "0.863104076023855", 
    AWAY_TRPM = "-0.845186446996287", 
    HOME_TEAM = "CHA", 
    AWAY_TEAM = "NOP"), 
.Names = c("HOME_TRPM", "AWAY_TRPM", "HOME_TEAM", "AWAY_TEAM"), 
row.names = c(NA, -1L), class = "data.frame")) 
+1

'do.call(rbind,c(df))'将转置而不使用't()'。 –

+0

可能需要像'setNames(do.call(data.frame,as.list(DF [[2]])),DF [[1]])这样的结果,这在dplyr中是不可能的,设计围绕数据清理。 – Frank

+0

@RichardScriven这看起来与t()相同,它给出了与期望输出不同的结构。 – geodex

回答

11

我想你想要tidyr而不是dplyr

library(tidyr) 
library(dplyr) 
df %>% mutate(group = 1) %>% 
     spread(HEADER, price) 

    group AWAY_TEAM   AWAY_TRPM HOME_TEAM   HOME_TRPM 
1  1  NOP -0.845186446996287  CHA 0.863104076023855 

使用此功能,您可以指定您的分组 - 您可以在select(-group)上添加以后再删除它们。

+1

工作得很好。干杯 – geodex