r - 是否有从多个数据集中获取多个列中的计数的函数?

标签 r count frequency

我有 2 列邮政编码。一个代表我的订单,另一个代表这些订单的报告问题,两者都在单独的数据集中。

我的订单数据集中有一个邮政编码列:

B0E1H0
B3M0G4
B3K6R6
B3L1J7
B0E1H0
B3K3M2
B3K2Z8
B0E1H0
B3K6R6
B0E1H0

我报告的问题数据集中有一个邮政编码列:
B3K6R6
B3K6R6
B0E1H0
B0E1H0
B3L1J7

我想最终得到一个数据框,它为我提供了一个唯一邮政编码列表、数量、问题数量以及每个邮政编码的问题比例,所以是这样的:
Postal code, Volume, Issues, Issue %
BOE1H0, 4, 2, 50%
B3K2Z8, 1, 0, 0%
B3K3M2, 1, 0, 0%
B3K6R6, 2, 2, 100%
B3L1J7, 1, 1, 100%
B3M0G4, 1, 0, 0% 

通过执行以下操作,我能够获得第一 2 行:
    orders <- read.csv("G:\\My Drive\\R\\R Data\\Stuff\\Text File\\Orders.csv", header = TRUE)
pcvec <- as.vector(orders["Postal.Code"])
unipc <- unique(pcvec,incomparables = F)
unipcvec <- as.vector(unipc)
pccount <- count(orders, "Postal.Code")
nrow(unipc)
x <- data.frame(pccount)
x <- rename(x, c("freq" = "Volume"))
x

    Postal.Code Volume
1        B0C1H0      1
2        B0E1B0      3
3        B0E1H0      7
4        B0E1L0      1
5        B0E1N0      1
6        B0E1P0      1
7        B0E1V0      1
8        B0E1W0      1
9        B0E2K0      1

我的卷数据集中有大约 5000 行,我的问题数据集中有大约 300 行,可以轻松做到这一点吗?

抱歉,如果我没有正确的术语,请告诉我是否可以澄清这一点。

最佳答案

这是 data.table 的一个选项.将'data.frame'转换为'data.table'(setDT(df1)setDT(df2)),通过'V1'获取行数(.N),做一个连接on 'V1',然后通过将非常见列除以得到百分比,同时分配 NA为 0

library(data.table)
setnames(setDT(df1)[, .N, V1][setDT(df2)[, .N, V1], 
    Issues := i.N, on = .(V1)][, Issue_perc:= Issues/N * 100][is.na(Issues), 
     c('Issues', 'Issue_perc') := 0], 'N', 'Volume')[]
#       V1 Volume Issues Issue_perc
#1: B0E1H0      4      2         50
#2: B3M0G4      1      0          0
#3: B3K6R6      2      2        100
#4: B3L1J7      1      1        100
#5: B3K3M2      1      0          0
#6: B3K2Z8      1      0          0

dcast 的其他选项
dcast(rbindlist(list(df1, df2), idcol = 'grp')[, .N, .(grp, V1)],
   V1 ~ c("Volume", "Issues")[grp], value.var = "N", fill = 0)[, 
      Issue_perc := Issues/Volume * 100][]
#         V1 Issues Volume Issue_perc
#1: B0E1H0      2      4         50
#2: B3K2Z8      0      1          0
#3: B3K3M2      0      1          0
#4: B3K6R6      2      2        100
#5: B3L1J7      1      1        100
#6: B3M0G4      0      1          0

或使用 base R ,我们创建一个 union来自两个数据集的 'V1' 列中的元素,然后转换为 factorlevels指定为'lvls',得到table ,做一个mergetransform创建“Issue_perc”列
lvls <- union(df1$V1, df2$V1)
transform(merge(as.data.frame(table(factor(df1$V1, levels = lvls))), 
   as.data.frame(table(factor(df2$V1, levels = lvls))), by = 'Var1'), 
    Issue_perc = Freq.y/Freq.x * 100)
#     Var1 Freq.x Freq.y Issue_perc
#1 B0E1H0      4      2         50
#2 B3K2Z8      1      0          0
#3 B3K3M2      1      0          0
#4 B3K6R6      2      2        100
#5 B3L1J7      1      1        100
#6 B3M0G4      1      0          0

或带有 tidyverse 的选项,我们将数据集放入 list , map通过list , 将 'V1' 转换为 factorlevels如前所述,reduce list通过执行 inner_join 到单个 data.frame ,然后使用 mutate 创建百分比列
library(tidyverse)
list(df1, df2) %>% 
    map(~ .x %>% 
             mutate(V1 = factor(V1, levels = lvls)) %>% 
             count(V1,  .drop = FALSE)) %>%
             reduce(inner_join, by = 'V1') %>% 
             mutate(Issue_perc = n.y/n.x * 100) %>% 
             rename_at(vars(matches('n\\.')), ~ c("Volume", "Issues"))
# A tibble: 6 x 4
#  V1     Volume Issues Issue_perc
#  <fct>   <int>  <int>      <dbl>
#1 B0E1H0      4      2         50
#2 B3M0G4      1      0          0
#3 B3K6R6      2      2        100
#4 B3L1J7      1      1        100
#5 B3K3M2      1      0          0
#6 B3K2Z8      1      0          0

或者稍微不同的选择是将数据集放在 list 中。 ,然后将它们与分组列绑定(bind),count获取频率,spread为“宽”格式,然后创建新的“perc”列
list(df1, df2) %>%
    bind_rows(.id = 'grp') %>%
    count(grp, V1) %>% 
    mutate(grp = c("Volume", "Issues")[as.integer(grp)]) %>% 
    spread(grp, n, fill = 0) %>% 
    mutate(Issue_perc = Issues/Volume * 100)
# A tibble: 6 x 4
#  V1     Issues Volume Issue_perc
#  <chr>   <dbl>  <dbl>      <dbl>
#1 B0E1H0      2      4         50
#2 B3K2Z8      0      1          0
#3 B3K3M2      0      1          0
#4 B3K6R6      2      2        100
#5 B3L1J7      1      1        100
#6 B3M0G4      0      1          0

数据
df1 <- structure(list(V1 = c("B0E1H0", "B3M0G4", "B3K6R6", "B3L1J7", 
"B0E1H0", "B3K3M2", "B3K2Z8", "B0E1H0", "B3K6R6", "B0E1H0")), row.names 
= c(NA, -10L), class = "data.frame")

df2 <- structure(list(V1 = c("B3K6R6", "B3K6R6", "B0E1H0", "B0E1H0", 
"B3L1J7")), row.names = c(NA, -5L), class = "data.frame")

关于r - 是否有从多个数据集中获取多个列中的计数的函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57237372/

相关文章:

list - 返回最频繁的 OCaml 函数

r - 如何在微基准测试中使用列表参数

c# - LINQ:分页技术,使用 take 和 skip 但还需要总记录 - 如何实现?

android - Android 上的频率检测 - AudioRecord

javascript - 计算单词出现的次数,允许特殊字符和换行符

mysql - 每个会计年度计算不同并在查询结果中显示所有日期

r - 根据值出现的频率分配权重

r - 如何将列名传递到使用 dplyr 的自定义函数中?

RStudio 语法格式 - 粗体函数名称

r - 时间序列 - 数据分割和模型评估