簡體   English   中英

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存在多少數據點並checkcount() 然后,您使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM