我有一個名為PimaDiabetes
.
PimaDiabetes <- read.csv("PimaDiabetes.csv")
PimaDiabetes[2:8][PimaDiabetes[2:8]==0] <- NA
mean_1 = 40.5
mean_0 = 30.7
p.tib <- PimaDiabetes %>%
as_tibble()
這是資料的快照:
并且可以從這里提取資料集。
我正在嘗試以這樣一種方式導航列,即我可以將資料集分組Outcomes
(因此選擇Outcome
0 和 1),并根據結果將不同的值(相關組的中位數)歸入列中。
因此,例如,在第五列胰島素中,有一些NA
值Outcome
是 1,有些Outcome
是 0。當一行中的值為 NA 時,我想將一個值 (40.5) 放入其中, and the is 1. 然后當值為NA且the為0Outcome
時,我想將mean_2放入其中。Outcome
在此之前我已經得到建議并嘗試過:
p.tib %>%
mutate(
p.tib$Insulin = case_when((p.tib$Outcome == 0) & (is.na(p.tib$Insulin)) ~ IN_0,
(p.tib$Outcome == 1) & (is.na(p.tib$Insulin) ~ IN_1,
TRUE ~ p.tib$Insulin))
但是它不斷產生以下錯誤:
Error: unexpected '=' in "p.tib %>% mutate(p.tib$Insulin ="
我能知道哪里出了問題嗎?
uj5u.com熱心網友回復:
設定
看來這個資料集也在pdp
R 的包中,稱為pima
. R 包資料與您的資料之間的唯一主要區別是pima
資料集的結果變數簡稱為“糖尿病”,并標記為“pos”和“neg”而不是 0/1。我已經加載了那個包和tidyverse
幫助。
#### Load Libraries ####
library(pdp)
library(tidyverse)
首先,我將資料轉換為小標題,以便于閱讀。
#### Reformat Data ####
p.tib <- pima %>%
as_tibble()
列印p.tib
,我們可以看到 insulin 變數在第一行有很多 NA 值,這將比其他一些缺失資料的變數更快地可視化。因此,我用它代替葡萄糖,但想法是一樣的。
# A tibble: 768 × 9
pregnant glucose press…1 triceps insulin mass pedig…2 age diabe…3
<dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <fct>
1 6 148 72 35 NA 33.6 0.627 50 pos
2 1 85 66 29 NA 26.6 0.351 31 neg
3 8 183 64 NA NA 23.3 0.672 32 pos
4 1 89 66 23 94 28.1 0.167 21 neg
5 0 137 40 35 168 43.1 2.29 33 pos
6 5 116 74 NA NA 25.6 0.201 30 neg
7 3 78 50 32 88 31 0.248 26 pos
8 10 115 NA NA NA 35.3 0.134 29 neg
9 2 197 70 45 543 30.5 0.158 53 pos
10 8 125 96 NA NA NA 0.232 54 pos
# … with 758 more rows, and abbreviated variable names 1?pressure,
# 2?pedigree, 3?diabetes
# ? Use `print(n = ...)` to see more rows
尋找均值
瀏覽完資料后,我檢查了每個患有糖尿病和未患糖尿病的組的平均值,方法是首先按糖尿病分組group_by
,然后將資料框折疊成每個組平均值的摘要,從而創建mean_insulin
變數(您可以看到洗掉NA 值推導平均值):
#### Check Mean by Group ####
p.tib %>%
group_by(diabetes) %>%
summarise(mean_insulin = mean(insulin,
na.rm=T))
我們應該輸入的值似乎在下面。這里的組在您的資料中標記為“neg”或 0,在您的資料中標記為“pos”或 1。如果需要,您可以將這些組轉換為那些數字,但我將其保留原樣以便于閱讀:
# A tibble: 2 × 2
diabetes mean_insulin
<fct> <dbl>
1 neg 130.
2 pos 207.
均值插補
從那里,我們將使用case_when
as 向量化的 ifelse 陳述句。首先,我們mutate
用來轉化胰島素。然后我們case_when
通過設定三個測驗來使用。首先,如果組為負且值為 NA,我們將其轉換為平均值 130。如果組在相同條件下為正,則使用 207。對于所有其他值(TRUE 部分),我們僅使用胰島素的正常值。這里的&
操作員只是說“只有在這兩個測驗都為真時才能進行此轉換”。接下來~
是要發生的轉變。
#### Impute Mean ####
p.tib %>%
mutate(
insulin = case_when(
(diabetes == "neg") & (is.na(insulin)) ~ 130,
(diabetes == "pos") & (is.na(insulin)) ~ 207,
TRUE ~ insulin
)
)
您現在會注意到胰島素資料的第一行被突變替換,其余的保持不變:
# A tibble: 768 × 9
pregnant glucose press…1 triceps insulin mass pedig…2 age diabe…3
<dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <fct>
1 6 148 72 35 207 33.6 0.627 50 pos
2 1 85 66 29 130 26.6 0.351 31 neg
3 8 183 64 NA 207 23.3 0.672 32 pos
4 1 89 66 23 94 28.1 0.167 21 neg
5 0 137 40 35 168 43.1 2.29 33 pos
6 5 116 74 NA 130 25.6 0.201 30 neg
7 3 78 50 32 88 31 0.248 26 pos
8 10 115 NA NA 130 35.3 0.134 29 neg
9 2 197 70 45 543 30.5 0.158 53 pos
10 8 125 96 NA 207 NA 0.232 54 pos
# … with 758 more rows, and abbreviated variable names 1?pressure,
# 2?pedigree, 3?diabetes
# ? Use `print(n = ...)` to see more rows
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/536394.html
標籤:r