这是我拥有的数据帧的示例:
Location <- c("a", "a", "a", "b", "b", "b", "b")
Code <- c("70", "70", "60", "60", "60", "60", "50")
df <- data.frame(Location, Code)
我想使用以下代码对代码进行分组和总结:
df2 <- df %>%
dplyr::group_by(df$Code) %>%
dplyr::summarize(Number = n()) %>%
dplyr::mutate(Percent = round((Number/sum(Number)*100))) %>%
dplyr::arrange(desc(Number))
我希望在每个位置都可以。并增加一些困难;尚不清楚是否事先有不同的位置。我们的目标是拥有一个自动功能,通过仅使用不同的数据框(不清楚其中的位置)来为我提供每个位置的结果。
我正在寻找的结果是df2。 df2适用于所有位置。我想要一个数据框,其中列出了每个位置的代码并进行了汇总。因此位置“ a”将具有代码70(2次)和60(1次),位置“ b”具有60(3次)和50(1次)的代码。
我无法为此找到解决方案(仅当我逐步执行时才这样做)
谢谢。
答案 0 :(得分:1)
我们可以为count
和Location
的每个Code
个肠子,并使用Location
计算每个group_by
的比率。
library(dplyr)
df %>%
count(Location, Code) %>%
group_by(Location) %>%
mutate(Percent = n/sum(n) * 100)
# Location Code n Percent
# <chr> <chr> <int> <dbl>
#1 a 60 1 33.3
#2 a 70 2 66.7
#3 b 50 1 25
#4 b 60 3 75
如果我们希望将数据作为每个Location
的单独列。
df %>%
count(Location, Code) %>%
tidyr::pivot_wider(names_from = Location, values_from = n,
values_fill = list(n = 0))
在基数R中,您可以使用table
。
table(df$Code, df$Location)
答案 1 :(得分:1)
使用Ronak逻辑的Base R解决方案:
within(df, {
n_vec <- as.numeric(ave(paste0(Location, Code), paste0(Location, Code), FUN = length))
percent_vec <- ave(n_vec, Location, FUN = function(x){x / sum(n_vec)}) * 100
}
)
答案 2 :(得分:1)
我们也可以将summarise
与group_by
一起使用
library(dplyr)
df %>%
group_by(Location, Code) %>%
summarise(Percent = n()) %>%
mutate(Percent = Percent/sum(Percent) * 100)