类似R透视的数据 [英] R - Pivot like data
本文介绍了类似R透视的数据的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
使用R和tidyverse库,我试图实现类似枢轴的结果。这里是数据集示例:
zz <- " Date ParAB ParCD
1 2017-05-27 A C
2 2017-05-27 B D
3 2017-05-27 A D
4 2017-05-27 B C
5 2017-05-27 B C
6 2017-05-28 A D
7 2017-05-28 A C
8 2017-05-28 A C
9 2017-05-28 A D"
Data <- read.table(text=zz, header = TRUE)}
我希望将数据转换为每天发生次数如下所示:
Date A B C D
2017-05-27 2 3 3 2
2017-05-28 2 0 1 1
我试用了在Parab列上效果很好的扩散函数。
Data %>%
group_by(Date, ParAB, ParCD) %>%
summarise(occr = n()) %>%
spread(ParAB, occr, fill = 0) %>%
mutate(occrCD = A+B)
所以结果是:
# A tibble: 4 x 5
# Groups: Date [2]
Date ParCD A B occrCD
<fctr> <fctr> <dbl> <dbl> <dbl>
1 2017-05-27 C 1 2 3
2 2017-05-27 D 1 1 2
3 2017-05-28 C 2 0 2
4 2017-05-28 D 2 0 2
然后当我第二次尝试展开时,它不能按预期工作。不会为C和D行的特定日期添加A列(和B列)的数据。结果我得到了错误的数据。
包含两个步骤的代码:
Data %>%
group_by(Date, ParAB, ParCD) %>%
summarise(occr = n()) %>%
spread(ParAB, occr, fill = 0) %>% # first spread - result as expected
mutate(occrCD = A+B) %>%
spread(ParCD, occrCD, fill = 0) %>% # second spread, lost sum for A and B
group_by(Date) %>%
summarise_all(sum)
结果不是我想要的。错误是可见的,因为对于C+D,A+B应该等于,但对于2017-05-28,则不是。:(
# A tibble: 2 x 5
Date A B C D
<fctr> <dbl> <dbl> <dbl> <dbl>
1 2017-05-27 2 3 3 2
2 2017-05-28 2 0 2 2
我相信这是微不足道的,但由于我是新人,非常感谢您的帮助。
M
推荐答案
如果将所有参数放在一列中,则没有理由重复spread
。
library(dplyr)
library(tidyr)
zz <- " Date ParAB ParCD
1 2017-05-27 A C
2 2017-05-27 B D
3 2017-05-27 A D
4 2017-05-27 B C
5 2017-05-27 B C
6 2017-05-28 A D
7 2017-05-28 A C
8 2017-05-28 A C
9 2017-05-28 A D"
Data <- read.table(text=zz, header = TRUE, stringsAsFactors = F)
Data %>%
gather(v1,value,-Date) %>%
count(Date, value) %>%
spread(value, n, fill = 0)
# # A tibble: 2 x 5
# Date A B C D
# * <chr> <dbl> <dbl> <dbl> <dbl>
# 1 2017-05-27 2 3 3 2
# 2 2017-05-28 4 0 2 2
这篇关于类似R透视的数据的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文