为R中的某些值计算数据帧中的行百分比差异
我有一个如下所示的数据帧:为R中的某些值计算数据帧中的行百分比差异,r,dplyr,R,Dplyr,我有一个如下所示的数据帧: Date Type Count <date> <fct> <int> 1 2018-11-01 B 2 2 2018-11-01 A 4 3 2018-11-02 A 1 4 2018-11-03 A 4 5 2018-11-04 A 3 6 2018-11-05 A 2 7 2018-11-06 C 1 8 2018-11-06 A
Date Type Count
<date> <fct> <int>
1 2018-11-01 B 2
2 2018-11-01 A 4
3 2018-11-02 A 1
4 2018-11-03 A 4
5 2018-11-04 A 3
6 2018-11-05 A 2
7 2018-11-06 C 1
8 2018-11-06 A 1
9 2018-11-07 A 1
我们可以使用
complete
使用fill=0
用0填充缺少的类型
,然后执行计算。这是假设“A”、“B”和“C”的每个日期最多只有一个值
库(tidyverse)
df%>%
分组单位(日期)%>%
完成(类型,填充=列表(计数=0))%>%
总结(计数=(计数[类型==“A”]-计数[类型==“C”])/总和(计数))
#日期计数
#
#1 2018-11-01 0.667
#2 2018-11-02 1
#3 2018-11-03 1
#4 2018-11-04 1
#5 2018-11-05 1
#6 2018-11-06 0
#7 2018-11-07 1
我们可以使用complete
使用fill=0
用0填充缺少的类型
,然后执行计算。这是假设“A”、“B”和“C”的每个日期最多只有一个值
库(tidyverse)
df%>%
分组单位(日期)%>%
完成(类型,填充=列表(计数=0))%>%
总结(计数=(计数[类型==“A”]-计数[类型==“C”])/总和(计数))
#日期计数
#
#1 2018-11-01 0.667
#2 2018-11-02 1
#3 2018-11-03 1
#4 2018-11-04 1
#5 2018-11-05 1
#6 2018-11-06 0
#7 2018-11-07 1
对于这样的计算,我更喜欢将形状改成宽的形状,这样我就可以直接访问我要进行差异处理的列,即a、B和C列。这有点冗长,但它让我更好地处理数据中的内容
与@Ronak Shah的答案类似,我首先使用类似于complete
的东西来填充任何缺少的日期和类型组合。我还按组汇总计数,以防对任何日期类型组合有多个观察结果
库(tidyverse)
df_完成百分比
分组依据(日期、类型)%>%
汇总(计数=总和(计数))%>%
解组()%>%
完成(日期、类型、填写=列表(计数=0))
df_完成
#>#A tibble:21 x 3
#>日期类型计数
#>
#>2018年11月1日A 4
#>2 2018-11-01 B 2
#>3 2018-11-01 C 0
#>4 2018-11-02 A 1
#>5 2018-11-02 B 0
#>6 2018-11-02 C 0
#>7 2018-11-03 A 4
#>8 2018-11-03 B 0
#>9 2018-11-03 C 0
#>10 2018-11-04 A 3
#> # ... 还有11行
然后使用spread
,我得到每种类型的列,然后进行计算。如果您想像示例中那样格式化为百分比字符串,可以将计数传递到scales::percent
,例如,它将0.75格式化为75%。然后,您可以除去date和count之外的列,或者在更复杂的情况下,您可能需要进一步重塑
df_完成%>%
排列(键=类型,值=计数)%>%
突变(计数=(A-C)/(A+B+C))%>%
变异(计数=比例::百分比(计数))%>%
选择(日期、计数)
#>#A tibble:7 x 2
#>日期计数
#>
#> 1 2018-11-01 67%
#> 2 2018-11-02 100%
#> 3 2018-11-03 100%
#> 4 2018-11-04 100%
#> 5 2018-11-05 100%
#> 6 2018-11-06 0%
#> 7 2018-11-07 100%
细微的变化是使用rowwise
按每行分组,这允许您在类型列上调用sum
df_完成%>%
排列(键=类型,值=计数)%>%
行()
突变(计数=(A-C)/和(A,B,C))%>%
变异(计数=比例::百分比(计数))%>%
选择(日期、计数)
#>来源:本地数据帧[7 x 2]
#>小组:
#>
#>#A tibble:7 x 2
#>日期计数
#>
#> 1 2018-11-01 66.7%
#> 2 2018-11-02 100%
#> 3 2018-11-03 100%
#> 4 2018-11-04 100%
#> 5 2018-11-05 100%
#> 6 2018-11-06 0%
#> 7 2018-11-07 100%
由(v0.2.1)于2018年11月28日创建。对于类似的计算,我更喜欢将形状改成宽的形状,这样我就可以直接访问我所取差异的列,即a、B和C列。这有点详细,但它让我更好地处理数据中的内容
与@Ronak Shah的答案类似,我首先使用类似于complete
的东西来填充任何缺少的日期和类型组合。我还按组汇总计数,以防对任何日期类型组合有多个观察结果
库(tidyverse)
df_完成百分比
分组依据(日期、类型)%>%
汇总(计数=总和(计数))%>%
解组()%>%
完成(日期、类型、填写=列表(计数=0))
df_完成
#>#A tibble:21 x 3
#>日期类型计数
#>
#>2018年11月1日A 4
#>2 2018-11-01 B 2
#>3 2018-11-01 C 0
#>4 2018-11-02 A 1
#>5 2018-11-02 B 0
#>6 2018-11-02 C 0
#>7 2018-11-03 A 4
#>8 2018-11-03 B 0
#>9 2018-11-03 C 0
#>10 2018-11-04 A 3
#> # ... 还有11行
然后使用spread
,我得到每种类型的列,然后进行计算。如果您想像示例中那样格式化为百分比字符串,可以将计数传递到scales::percent
,例如,它将0.75格式化为75%。然后,您可以除去date和count之外的列,或者在更复杂的情况下,您可能需要进一步重塑
df_完成%>%
排列(键=类型,值=计数)%>%
突变(计数=(A-C)/(A+B+C))%>%
变异(计数=比例::百分比(计数))%>%
选择(日期、计数)
#>#A tibble:7 x 2
#>日期计数
#>
#> 1 2018-11-01 67%
#> 2 2018-11-02 100%
#> 3 2018-11-03 100%
#> 4 2018-11-04 100%
#> 5 2018-11-05 100%
#> 6 2018-11-06 0%
#> 7 2018-11-07 100%
细微的变化是使用rowwise
按每行分组,这允许您在类型列上调用sum
df_完成%>%
排列(键=类型,值=计数)%>%
行()
突变(计数=(A-C)/和(A,B,C))%>%
变异(计数=比例::百分比(计数))%>%
选择(日期、计数)
#>所以
Date Count
<date> <int>
1 2018-11-01 66.7%
2 2018-11-02 some %
3 2018-11-03 some %
4 2018-11-04 some %
5 2018-11-05 some %
6 2018-11-06 some %
7 2018-11-07 some %
abc %>% group_by(DATE) %>%
arrange(DATE) %>%
mutate(diff = n - lag(n, default = first(n)))
library(tidyverse)
df %>%
group_by(Date) %>%
complete(Type, fill = list(Count = 0)) %>%
summarise(Count = (Count[Type == "A"] - Count[Type == "C"])/sum(Count))
# Date Count
# <fct> <dbl>
#1 2018-11-01 0.667
#2 2018-11-02 1
#3 2018-11-03 1
#4 2018-11-04 1
#5 2018-11-05 1
#6 2018-11-06 0
#7 2018-11-07 1