我正在尝试编写一个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列来进行此工作。但是,我的直觉是,有一种更有效的方法可以做到这一点。希望能对此有所帮助。谢谢!
答案 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解决方案,因此我们只需要指出这一点即可。