在 R 多变量中转置数据(最好使用 tidyverse 或 stargazer)

Transpose data in R multiple variables (preferrably with tidyverse or stargazer)

我看过类似的主题,但 none 似乎正是我要找的。如果这是一个重复的问题,我们深表歉意。

从我的 tidyverse 函数,我已经能够生成以下内容:

  locationAndYear  var1 var2  var3        var4  var5   var6
  <chr>           <dbl> <dbl> <dbl>       <dbl> <dbl>  <dbl>
1 City 2015       0.425 0.412 0.854       0.844 0.853  0.368
2 City 2016       0.270 0.259 0.842       0.834 0.856  0.456
3 City 2018       0.468 0.454 0.816       0.833 0.848  0.430
4 City 2019       0.336 0.604 0.842       0.852 0.887  0.525

我只想转置它,使 table 看起来像这样,这样我就可以在 RMarkdown 文档中呈现它。 (也许在 stargazer 中有更好的方法来做到这一点)

  variable     City 2015  City 2016   City 2018   City 2019
  var1             0.425      0.270       0.468       0.336
  var2             0.412      0.259       0.454       0.604
  var3             0.854      0.842       0.816       0.842
  var4             0.844      0.834       0.833       0.852
  var5             0.853      0.856       0.848       0.887
  var6             0.368      0.456       0.430       0.525

这基本上是为了一份报告 - 所以最终想以一种很好的 table 格式来做这件事,比如 stargazer。

提前感谢您的任何建议!

以长格式获取数据,然后以宽格式获取数据:

library(tidyr)
df %>%
  pivot_longer(cols = -locationAndYear, names_to = 'variable') %>%
  pivot_wider(names_from = locationAndYear, values_from = value)

# variable  City_2015 City_2016 City_2018 City_2019
#  <chr>     <dbl>     <dbl>     <dbl>     <dbl>
#1 var1      0.425     0.27      0.468     0.336
#2 var2      0.412     0.259     0.454     0.604
#3 var3      0.854     0.842     0.816     0.842
#4 var4      0.844     0.834     0.833     0.852
#5 var5      0.853     0.856     0.848     0.887
#6 var6      0.368     0.456     0.43      0.525

使用data.table

library(data.table)
dcast(melt(setDT(df), id.vars = 'locationAndYear'), 
      variable~locationAndYear, value.var = 'value')

数据

df <- structure(list(locationAndYear = c("City_2015", "City_2016", 
"City_2018", "City_2019"), var1 = c(0.425, 0.27, 0.468, 0.336
 ), var2 = c(0.412, 0.259, 0.454, 0.604), var3 = c(0.854, 0.842, 
0.816, 0.842), var4 = c(0.844, 0.834, 0.833, 0.852), var5 = c(0.853, 
0.856, 0.848, 0.887), var6 = c(0.368, 0.456, 0.43, 0.525)), 
class = "data.frame", row.names = c(NA, -4L))