Reshape table 使用列值作为列名?

Reshape table using column values as column names?

我正在尝试重塑 table。以下 table 是通过在 df:

上使用此代码创建的
df2 <- df %>% 
    group_by(Organization, Year) %>% 
    tally()
组织 N
X 1999 3
X 2010 3
2009 4
2010 5
2011 5
Z 2008 5
Z 2011 5

我要创建的内容:

组织 1999 2008 2009 2010 2011
X 3 0 0 3 0
0 0 4 5 5
Z 0 5 0 0 5

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

我们需要 pivot_widerarrange 通过 'Year' 处理行之后。对于 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))

您还可以在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