在dplyr中转置

geo*_*dex 8 transpose r dplyr

我有以下data.frame

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
Run Code Online (Sandbox Code Playgroud)

我想要转置.如何在不使用t()的情况下在dplyr中执行此操作?我试过了

df %>% tidyr::spread(HEADER , price)
Run Code Online (Sandbox Code Playgroud)

但它不会给出扁平结构,而是这样做:

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))
Run Code Online (Sandbox Code Playgroud)

生成的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"))
Run Code Online (Sandbox Code Playgroud)

jer*_*ycg 17

我想你想要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
Run Code Online (Sandbox Code Playgroud)

使用此功能,您可以指定分组 - 您可以select(-group)稍后添加以将其删除.


lit*_*ird 15

spread已退休,tidyr现在建议使用pivot_wider()

library(tidyverse)
df %>%
    pivot_wider(names_from = HEADER, values_from = price)
Run Code Online (Sandbox Code Playgroud)


小智 7

使用tibblepackage (of tidyversefamily),您可以消除t().

 df_t = as_tibble(t(df), rownames = "row_names")
Run Code Online (Sandbox Code Playgroud)


Kee*_*lyD 5

他们一定已经更新了 tidyr ,因为这是最初发布的,因为我认为它满足了您现在最初的要求:

\n\n
> library(dplyr)\n> library(tidyr)\nWarning message:\npackage \xe2\x80\x98tidyr\xe2\x80\x99 was built under R version 3.4.4 \n> df\n         HEADER              price\n    1 HOME_TRPM  0.863104076023855\n    2 AWAY_TRPM -0.845186446996287\n    3 HOME_TEAM                CHA\n    4 AWAY_TEAM                NOP\n\n    > tidyr::spread(df, HEADER, price)\n      AWAY_TEAM          AWAY_TRPM HOME_TEAM         HOME_TRPM\n    1       NOP -0.845186446996287       CHA 0.863104076023855\n
Run Code Online (Sandbox Code Playgroud)\n\n

如果您有更大的数据框,您可以随时收集然后传播:

\n\n
> mdf <- data.frame(Things = c("Cookies","Cake","Knives","Kittens", "Politics"), Darkness = sample(1:5), Despair = sample(1:5), Defeat = sample(1:5))> mdf \n    Things Darkness Despair Defeat\n1  Cookies        3       4      1\n2     Cake        2       2      5\n3   Knives        1       3      2\n4  Kittens        5       5      3\n5 Politics        4       1      4\n> mdf %>% tidyr::gather(Idea, Warning_Level, Darkness:Defeat)\n     Things     Idea Warning_Level\n1   Cookies Darkness             3\n2      Cake Darkness             2\n3    Knives Darkness             1\n4   Kittens Darkness             5\n5  Politics Darkness             4\n6   Cookies  Despair             4\n7      Cake  Despair             2\n8    Knives  Despair             3\n9   Kittens  Despair             5\n10 Politics  Despair             1\n11  Cookies   Defeat             1\n12     Cake   Defeat             5\n13   Knives   Defeat             2\n14  Kittens   Defeat             3\n15 Politics   Defeat             4\n> mdf %>% tidyr::gather(Idea, Warning_Level, Darkness:Defeat) %>% tidyr::spread(Things, Warning_Level)\n      Idea Cake Cookies Kittens Knives Politics\n1 Darkness    2       3       5      1        4\n2   Defeat    5       1       3      2        4\n3  Despair    2       4       5      3        1\n
Run Code Online (Sandbox Code Playgroud)\n