R 为每个组创建频率表
在R中,我有一个data.frame,它有一个ID、一个周期和一对给定年份的变量 我想要实现的是创建一个data.frame,在该框架中,对于每个时期和每个可变年份1-4,显示频率显示特定年份19702013-2017的显示频率。 期望的结果应该是这样的:R 为每个组创建频率表,r,R,在R中,我有一个data.frame,它有一个ID、一个周期和一对给定年份的变量 我想要实现的是创建一个data.frame,在该框架中,对于每个时期和每个可变年份1-4,显示频率显示特定年份19702013-2017的显示频率。 期望的结果应该是这样的: 我在R方面有中等的经验,我相信这是可以实现的。但我完全不知道如何解决这个问题。建议/想法?如果我正确理解您的问题,您可以通过软件包重塑2实现这一点,方法是首先通过melt将数据从宽格式转换为长格式,然后在选择所需类别时通过cast将其返回-我
我在R方面有中等的经验,我相信这是可以实现的。但我完全不知道如何解决这个问题。建议/想法?如果我正确理解您的问题,您可以通过软件包重塑2实现这一点,方法是首先通过melt将数据从宽格式转换为长格式,然后在选择所需类别时通过cast将其返回-我希望这是您需要的
df <- structure(list(id = 10001:10010,
period = structure(c(1L, 2L, 1L, 1L, 2L, 1L, 2L, 1L, 2L, 1L),
.Label = c("2017-01", "2017-02"), class = "factor"),
year1 = c(2013, 2014, 2014, 2017, 1970, 2014, 1970, 2014, 2014, 1970),
year2 = c(2015, NA, 2015, 2015, 1970, 1970, 2014, 2017, 2014, 2017),
year3 = c(2015, 2014, 2015, NA, NA, 2014, 2014, 2015, 1970, 2014),
year4 = c(1970, 2014, 2013, 2014, 1970, 1970, 2014, 2015, 2015, NA)),
.Names = c("id", "period", "year1", "year2", "year3", "year4"),
row.names = c(NA, -10L),
class = "data.frame")
library(reshape2)
dcast(melt(df[,-1]), period + variable ~ value)
# period variable 1970 2013 2014 2015 2017 NA
# 1 2017-01 year1 1 1 3 0 1 0
# 2 2017-01 year2 1 0 0 3 2 0
# 3 2017-01 year3 0 0 2 3 0 1
# 4 2017-01 year4 2 1 1 1 0 1
# 5 2017-02 year1 2 0 2 0 0 0
# 6 2017-02 year2 1 0 2 0 0 1
# 7 2017-02 year3 1 0 2 0 0 1
# 8 2017-02 year4 1 0 2 1 0 0
如果我正确理解您的问题,您可以通过软件包重塑2实现这一点,首先通过melt将数据从宽格式转换为长格式,然后在选择所需类别时通过cast将其转换回来-我希望这就是您需要的
df <- structure(list(id = 10001:10010,
period = structure(c(1L, 2L, 1L, 1L, 2L, 1L, 2L, 1L, 2L, 1L),
.Label = c("2017-01", "2017-02"), class = "factor"),
year1 = c(2013, 2014, 2014, 2017, 1970, 2014, 1970, 2014, 2014, 1970),
year2 = c(2015, NA, 2015, 2015, 1970, 1970, 2014, 2017, 2014, 2017),
year3 = c(2015, 2014, 2015, NA, NA, 2014, 2014, 2015, 1970, 2014),
year4 = c(1970, 2014, 2013, 2014, 1970, 1970, 2014, 2015, 2015, NA)),
.Names = c("id", "period", "year1", "year2", "year3", "year4"),
row.names = c(NA, -10L),
class = "data.frame")
library(reshape2)
dcast(melt(df[,-1]), period + variable ~ value)
# period variable 1970 2013 2014 2015 2017 NA
# 1 2017-01 year1 1 1 3 0 1 0
# 2 2017-01 year2 1 0 0 3 2 0
# 3 2017-01 year3 0 0 2 3 0 1
# 4 2017-01 year4 2 1 1 1 0 1
# 5 2017-02 year1 2 0 2 0 0 0
# 6 2017-02 year2 1 0 2 0 0 1
# 7 2017-02 year3 1 0 2 0 0 1
# 8 2017-02 year4 1 0 2 1 0 0
这是一个使用tidyverse的想法
这就给了,
这是一个使用tidyverse的想法
这就给了,
如果你想稍微缩短这个时间,你可以用countperiod,category,val%>%spreadval,n,fill=0,而不是一步一步地进行分组……谢谢你,你的代码很容易理解!虽然我是tidyverse的超级粉丝,但我必须将手册中的答案标记为a答案,因为它太快,太短:。非常感谢你的帮助!!!我从来没有用过收集,我会调查的!没问题。乐于帮助:请注意,包Reforme2是Tydiversity的大型包集的先例。我不确定,但我想在@Sotos解决方案的背景下,Reformae2的代码是运行的,或者至少是重用的。必须在github上检查这一点。因此,关于背景中的代码,解决方案可能非常相似。但是,如果您打算使用此软件包,重塑2的一个优点是它与data.table配合得非常好。如果您想稍微缩短此软件包,您可以使用countperiod、category、val%>%spreadval、n、fill=0,而不是逐步使用group_…谢谢,您的代码很容易理解!虽然我是tidyverse的超级粉丝,但我必须将手册中的答案标记为a答案,因为它太快,太短:。非常感谢你的帮助!!!我从来没有用过收集,我会调查的!没问题。乐于帮助:请注意,包Reforme2是Tydiversity的大型包集的先例。我不确定,但我想在@Sotos解决方案的背景下,Reformae2的代码是运行的,或者至少是重用的。必须在github上检查这一点。因此,关于背景中的代码,解决方案可能非常相似。但是,如果您打算使用此软件包,重塑2的一个优点是它非常适合data.table。。这种方法很简单,我有点惭愧,因为我自己没有想到。谢谢您不可能始终知道与您的问题相匹配的每个包及其选项。我也有过这样的经历:我遇到的任务被其他人在一行中解决了。但有时候也是这样,所以别担心,祝你的项目好运。是的,这正是我想要的。。这种方法很简单,我有点惭愧,因为我自己没有想到。谢谢您不可能始终知道与您的问题相匹配的每个包及其选项。我也有过这样的经历:我遇到的任务被其他人在一行中解决了。但有时也是这样,所以不用担心,祝你的项目好运。
df <- structure(list(id = 10001:10010,
period = structure(c(1L, 2L, 1L, 1L, 2L, 1L, 2L, 1L, 2L, 1L),
.Label = c("2017-01", "2017-02"), class = "factor"),
year1 = c(2013, 2014, 2014, 2017, 1970, 2014, 1970, 2014, 2014, 1970),
year2 = c(2015, NA, 2015, 2015, 1970, 1970, 2014, 2017, 2014, 2017),
year3 = c(2015, 2014, 2015, NA, NA, 2014, 2014, 2015, 1970, 2014),
year4 = c(1970, 2014, 2013, 2014, 1970, 1970, 2014, 2015, 2015, NA)),
.Names = c("id", "period", "year1", "year2", "year3", "year4"),
row.names = c(NA, -10L),
class = "data.frame")
library(reshape2)
dcast(melt(df[,-1]), period + variable ~ value)
# period variable 1970 2013 2014 2015 2017 NA
# 1 2017-01 year1 1 1 3 0 1 0
# 2 2017-01 year2 1 0 0 3 2 0
# 3 2017-01 year3 0 0 2 3 0 1
# 4 2017-01 year4 2 1 1 1 0 1
# 5 2017-02 year1 2 0 2 0 0 0
# 6 2017-02 year2 1 0 2 0 0 1
# 7 2017-02 year3 1 0 2 0 0 1
# 8 2017-02 year4 1 0 2 1 0 0
library(tidyverse)
df %>%
gather(category, val, -c(id, period)) %>%
na.omit() %>%
group_by(period, category, val) %>%
summarise(new = n()) %>%
spread(val, new, fill = 0)
# A tibble: 8 x 7
# Groups: period, category [8]
period category `1970` `2013` `2014` `2015` `2017`
* <fctr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl>
1 2017-01 year1 1 1 3 0 1
2 2017-01 year2 1 0 0 3 2
3 2017-01 year3 0 0 2 3 0
4 2017-01 year4 2 1 1 1 0
5 2017-02 year1 2 0 2 0 0
6 2017-02 year2 1 0 2 0 0
7 2017-02 year3 1 0 2 0 0
8 2017-02 year4 1 0 2 1 0
df %>%
gather(category, val, -c(id, period)) %>%
na.omit() %>%
count(period, category, val) %>%
spread(val, n, fill = 0)