使用for循环创建重塑的数据框

时间:2018-08-29 15:52:53

标签: r for-loop reshape

我正在尝试编写一个for循环,该循环可以将数据帧重新组织到表中以进行发布,例如在Excel中。

以下是我的问题的一小部分数据数据:

df <- data.frame(ST = c("NY", "NJ", "PA", "NY", "NJ", "PA"),
             YR = c(2010, 2010, 2010, 2011, 2011, 2011),
             X = c(.25, .24, .23, .24, .23, .22)) 

我想生成一个表,该表在“州”列中一次列出每个州,每年以标题为“ X Year”的行名列出,并在正确的年份下列出每个X值。在这种情况下,它看起来像这样,减去“ ...”:

状态| 2010 Pop | 2011流行音乐

NY ..... .25 .............. .24

NJ ....... 24 ................ .23

PA ..... .23 ............... .22

我拥有大约十二年的所有州的数据,因此我可以通过每年制作一个数据框,重命名列名称,绑定列并消除重复的ST列来进行此工作。但是,我的直觉是,有一种更有效的方法可以做到这一点。希望能对此有所帮助。谢谢!

3 个答案:

答案 0 :(得分:0)

您可以尝试使用reshape功能:

df <- data.frame(ST = c("NY", "NJ", "PA", "NY", "NJ", "PA"),
                 YR = c(2010, 2010, 2010, 2011, 2011, 2011),
                 X = c(.25, .24, .23, .24, .23, .22))

reshape(df, timevar = "YR", idvar = "ST", direction = "wide")

  ST X.2010 X.2011
1 NY   0.25   0.24
2 NJ   0.24   0.23
3 PA   0.23   0.22

答案 1 :(得分:0)

这将为您提供使用tidyverse软件包所需的结果。

library(tidyr)
library(dplyr)

df %>% 
  mutate(YR = paste(YR, "Pop")) %>% # add Pop behind year for column headers
  rename(State = ST) %>% # rename state column for outcome
  spread(YR, X)

  State 2010 Pop 2011 Pop
1    NJ     0.24     0.23
2    NY     0.25     0.24
3    PA     0.23     0.22

P.S。我也投票结束了这个问题,因为已经有很多问题的答案,例如this on。但是现在它可能会帮助您解决问题。

答案 2 :(得分:0)

1)xtabs 使用基本R,我们可以得到一个简短的简单解决方案,而无需任何for循环或程序包依赖项:

xtabs(X ~., df)

给予:

    YR
ST   2010 2011
  NJ 0.24 0.23
  NY 0.25 0.24
  PA 0.23 0.22

2)轻按。这也仅使用基数R:

tapply(df[[3]], df[-3], sum)

给予:

    YR
ST   2010 2011
  NJ 0.24 0.23
  NY 0.25 0.24
  PA 0.23 0.22

3)动物园:这将为每个州创建年度时间序列:

library(zoo)
z <- read.zoo(df, index = "YR", split = "ST")

给予:

> z
       NJ   NY   PA
2010 0.24 0.25 0.23
2011 0.23 0.24 0.22

可以使用fortify.zoo(z)产生数据帧。

创建时间序列可能对简单地执行后续操作很有用。例如,将其绘制出来:

library(ggplot2)
autoplot(z) + scale_x_continuous(breaks = time(z)) # separate panels
autoplot(z, facet = NULL) + scale_x_continuous(breaks = time(z)) # single panel

3a)如果我们要生成时间序列,则为每个状态使用一列会更有意义,但可以将这些状态用作“时间”:

read.zoo(df, index = "ST", split = "YR", FUN = identity)

给出这个动物园系列,可以再次使用fortify.zoo将其转换为数据帧。

   2010 2011
NJ 0.24 0.23
NY 0.25 0.24
PA 0.23 0.22

4)tidyr @Dan Y已经在问题下的评论中提供了tidyr解决方案,因此我们只需要指出这一点即可。