Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 为每个组创建频率表_R - Fatal编程技术网

R 为每个组创建频率表

R 为每个组创建频率表,r,R,在R中,我有一个data.frame,它有一个ID、一个周期和一对给定年份的变量 我想要实现的是创建一个data.frame,在该框架中,对于每个时期和每个可变年份1-4,显示频率显示特定年份19702013-2017的显示频率。 期望的结果应该是这样的: 我在R方面有中等的经验,我相信这是可以实现的。但我完全不知道如何解决这个问题。建议/想法?如果我正确理解您的问题,您可以通过软件包重塑2实现这一点,方法是首先通过melt将数据从宽格式转换为长格式,然后在选择所需类别时通过cast将其返回-我

在R中,我有一个data.frame,它有一个ID、一个周期和一对给定年份的变量

我想要实现的是创建一个data.frame,在该框架中,对于每个时期和每个可变年份1-4,显示频率显示特定年份19702013-2017的显示频率。 期望的结果应该是这样的:


我在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)