[英]Dplyr: How to Rearrange and Split a Dataframe by A Categorical Group Within a Pivot Table Showing Summary Statistics in R
[英]R summary statistics from dataframe by group
如果這是重復,我道歉,我真的不知道我正在努力實現的正確術語。
我有一個葯物實驗室結果的數據框如下:
╔══════╦════════╗ ║ drug ║ result ║ ╠══════╬════════╣ ║ A ║ 10 ║ ║ B ║ 150 ║ ║ B ║ 50 ║ ║ A ║ 14 ║ ║ C ║ 3 ║ ║ C ║ 7 ║ ╚══════╩════════╝
對於每種葯物,我使用dplyr使用以下方法去除異常值(平均值> 4 SD):
cleaned <- data %>% group_by(drug) %>% filter(abs(result-mean(result))/sd(result) < 4)
但現在我想知道每個葯物有多少異常值,所以基本上我想生成一個如下所示的數據幀:
╔══════╦═══════════╦══════════╦════════════╗ ║ drug ║ total (N) ║ outliers ║ % outliers ║ ╠══════╬═══════════╬══════════╬════════════╣ ║ A ║ 100 ║ 7 ║ 0.07 ║ ║ B ║ 200 ║ 45 ║ 0.225 ║ ║ C ║ 300 ║ 99 ║ 0.33 ║ ╚══════╩═══════════╩══════════╩════════════╝
這樣做的最佳方法是什么?
由於沒有樣本數據,我決定使用mtcars數據集進行演示。 如果我按照你的方法,以下將是一種方式。 在這里,您想要找出您過濾掉的數據部分; 您使用setdiff()
來收集數據。 由於am
是本演示中的組變量,因此請使用count()
並查找每個組存在多少個異常值(即0或1為am
)。 您進一步嘗試使用select和unlist獲取所需的向量。 然后,使用summarise()
並計算am
存在多少數據點,並使用mutate()
添加新列。
library(dplyr)
library(tidyr)
mtcars %>%
group_by(am) %>%
filter(abs(disp-mean(disp))/sd(disp) < 1) %>%
setdiff(mtcars, .) %>%
count(am) %>%
select(2) %>%
unlist-> out
#out
#n1 n2
#8 2
summarize(group_by(mtcars, am), total = n()) %>%
mutate(outliers = out, percent = outliers / total)
# am total outliers percent
# (dbl) (int) (int) (dbl)
#1 0 19 8 0.4210526
#2 1 13 2 0.1538462
采取devmacrile的建議,我做了以下。 首先,使用組變量對數據進行分組。 然后,您要設置標志列。 在這里,我使用mutate()
創建了列。 列中有TRUE和FALSE。 您可以計算am
存在多少數據點並check
入count()
。 然后,您使用tidyr
包中的spread()
重塑結果。 現在計算am
0組和1組的總數據點。 再次,您使用am
對數據進行分組,最后在transmute()
處理百分比計算和列重命名。 我希望這個樣本能幫到你。
mtcars %>%
group_by(am) %>%
mutate(check = abs(disp-mean(disp))/sd(disp) < 1) %>%
count(am, check) %>%
spread(check, n) %>%
mutate(total = `FALSE` + `TRUE`) %>%
group_by(am) %>%
transmute(total, outliers = `FALSE`, percentage = `FALSE` / total)
# am total outliers percentage
# (dbl) (int) (int) (dbl)
#1 0 19 8 0.4210526
#2 1 13 2 0.1538462
我將創建一個標志字段(即1或0)來指示結果是否為異常值,然后將其輸入到相應的摘要中,而不是直接進入filter()。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.