【问题标题】:Reshape table using column values as column names?使用列值作为列名重塑表格?
【发布时间】:2021-09-22 19:09:46
【问题描述】:

我正在尝试重塑一张桌子。下表是通过在 df 上使用此代码创建的:

df2 <- df %>% 
    group_by(Organization, Year) %>% 
    tally()
Organization Year N
X 1999 3
X 2010 3
Y 2009 4
Y 2010 5
Y 2011 5
Z 2008 5
Z 2011 5

我正在尝试创建的内容:

Organization 1999 2008 2009 2010 2011
X 3 0 0 3 0
Y 0 0 4 5 5
Z 0 5 0 0 5

它只需要现有的年份而不是在中间创建新的年份(如 1999 年和 2008 年之间的差距),它会根据需要填充 0。

【问题讨论】:

  • 直接做table(df[c('Organization', 'Year')])而不是groupby,然后tally然后pivot_wider

标签: r dataframe dplyr reshape


【解决方案1】:

我们需要pivot_widerarrange按“年”排列行之后。与pivot_wider,它使用相同的数据出现顺序

library(dplyr)
library(tidyr)
df %>%
     arrange(Year) %>%
     pivot_wider(names_from = Year, values_from = N, values_fill = 0)

-输出

# A tibble: 3 x 6
  Organization `1999` `2008` `2009` `2010` `2011`
  <chr>         <int>  <int>  <int>  <int>  <int>
1 X                 3      0      0      3      0
2 Z                 0      5      0      0      5
3 Y                 0      0      4      5      5

数据

df <- structure(list(Organization = c("X", "X", "Y", "Y", "Y", "Z", 
"Z"), Year = c(1999L, 2010L, 2009L, 2010L, 2011L, 2008L, 2011L
), N = c(3L, 3L, 4L, 5L, 5L, 5L, 5L)), class = "data.frame", row.names = c(NA, 
-7L))

【讨论】:

  • 哇,谢谢!这非常有效。除了年份是随机排列的。有没有办法对它们进行数字排序,以便从 1999 年到 2011 年?
  • 对不起!不知道这个,我看到了“arrange(Year)”,问题解决了,谢谢!
【解决方案2】:

也可以使用data.table中的函数dcast,如下:

library(data.table)
dcast(as.data.table(df), Organization ~ Year, value.var="N", fill=0)

#    Organization  1999  2008  2009  2010  2011
# 1:            X     3     0     0     3     0
# 2:            Y     0     0     4     5     5
# 3:            Z     0     5     0     0     5

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-19
    • 2015-06-18
    • 2021-10-20
    • 1970-01-01
    • 2020-05-01
    相关资源
    最近更新 更多