考慮資料框:
df <- data.frame(x = c(1,2,1,1), y = c("a", "a", "b", "a"))
通過應用下面的代碼
library(tidyverse)
df %>%
pivot_wider(x, names_from = y, values_from = y, values_fn = length, names_prefix = "tot_", values_fill = 0) %>%
mutate(per_a = 100*tot_a / rowSums(select(.,starts_with("tot_")))) %>%
mutate(per_b = 100*tot_b / rowSums(select(.,starts_with("tot_"))))
一個得到結果
<dbl> <int> <int> <dbl> <dbl>
1 1 2 1 66.7 33.3
2 2 1 0 100 0
我的問題是:是否有可能使用 的單個呼叫獲得相同的結果pivot_wider,也就是說,沒有任何呼叫mutate?
uj5u.com熱心網友回復:
group_by我認為如果您想在不單獨處理每個百分比列的pivot_wider情況下執行一次,則需要兩次。mutateper
df %>%
group_by(x,y) %>%
count(name="tot") %>%
group_by(x) %>%
mutate(per = tot / sum(tot)) %>%
pivot_wider(id_cols = x, names_from=y, values_from=c(tot,per))
## A tibble: 2 x 5
## Groups: x [2]
# x tot_a tot_b per_a per_b
# <dbl> <int> <int> <dbl> <dbl>
#1 1 2 1 0.667 0.333
#2 2 1 NA 1 NA
這對我來說是“整潔的”,因為您正在長格式、整潔的資料中的 2 個分組掃描中進行所有計算,而不是嘗試手動選擇寬格式的多個列。
uj5u.com熱心網友回復:
附加解決方案選項
資料表
df <- data.frame(x = c(1,2,1,1), y = c("a", "a", "b", "a"))
library(data.table)
library(magrittr)
setDT(df)[, list(tot = .N), by = list(x, y)] %>%
.[, perc := proportions(tot), by = list(y)] %>%
dcast(x ~ y, value.var = c("tot", "perc"), fill = 0)
#> x tot_a tot_b perc_a perc_b
#> 1: 1 2 1 0.6666667 1
#> 2: 2 1 0 0.3333333 0
由reprex 包(v2.0.1)于 2021 年 12 月 10 日創建
整理宇宙
library(tidyverse)
df <- data.frame(x = c(1,2,1,1), y = c("a", "a", "b", "a"))
df %>%
pivot_wider(
x,
names_from = y,
values_from = y,
values_fn = length,
names_prefix = "tot_",
values_fill = 0
) %>%
mutate(across(starts_with("tot_"), proportions, .names = "{.col}_prop"))
#> # A tibble: 2 x 5
#> x tot_a tot_b tot_a_prop tot_b_prop
#> <dbl> <int> <int> <dbl> <dbl>
#> 1 1 2 1 0.667 1
#> 2 2 1 0 0.333 0
由reprex 包(v2.0.1)于 2021 年 12 月 10 日創建
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/378681.html
下一篇:將資料標準化為100作為平均值
