我對缺失值的資料集進行了 5 次插補。出于我的目的,我想用 5 個插補中的模式替換缺失值。假設我有以下資料集,其中 df 是我的原始資料,ID 是用于識別每個案例的分組變數,imp 是我的估算資料:
df <- data.frame(ID = c(1,2,3,4,5),
var1 = c(1,NA,3,6,NA),
var2 = c(NA,1,2,6,6),
var3 = c(NA,2,NA,4,3))
imp <- data.frame(ID = c(1,1,1,1,1,2,2,2,2,2,3,3,3,3,3,4,4,4,4,4,5,5,5,5,5),
var1 = c(1,2,3,3,2,5,4,5,6,6,7,2,3,2,5,6,5,6,6,6,3,1,2,3,2),
var2 = c(4,3,2,3,2,4,6,5,4,4,7,2,4,2,3,6,5,6,4,5,3,3,4,3,2),
var3 = c(7,6,5,6,6,2,3,2,4,2,5,4,5,3,5,1,2,1,3,2,1,2,1,1,1))
我有一種有效的方法,但它涉及大量手動編碼,因為我總共有大約 200 個變數(我在 3 個具有不同變數的不同資料集上執行此操作)。對于一個變數,我的代碼如下所示:
library(dplyr)
mode <- function(codes){
which.max(tabulate(codes))
}
var1 <- imp %>% group_by(ID) %>% summarise(var1 = mode(var1))
df3 <- df %>%
left_join(var1, by = "ID") %>%
mutate(var1 = coalesce(var1.x, var1.y)) %>%
select(-var1.x, -var1.y)
因此,只有當值為 NA 時,df 中的原始值才會被模式替換。
為每個變數手動編碼需要很長時間。我希望有一種更簡單的方法可以根據 ID 為每個變數的估算資料集計算模式,然后在原始資料中用該模式替換 NA。我想也許我可以將變數名放在一個向量中,并以某種方式用一個代碼遍歷它們,在其中我更改每個變數名,但我不知道這個想法去哪里。
x <- colnames(df)
# Attempting to iterate through variables names using i
i = as.factor(x[[2]])
這就是我被困的地方。任何幫助深表感謝!
uj5u.com熱心網友回復:
這是使用tidyverse. 從本質上講,我們可以將兩個資料幀旋轉很長,然后將它們合并在一起,coalesce一步而不是逐列。Mode函式取自這里。
library(tidyverse)
Mode <- function(x) {
ux <- unique(x)
ux[which.max(tabulate(match(x, ux)))]
}
imp_long <- imp %>%
group_by(ID) %>%
summarise(across(everything(), Mode)) %>%
pivot_longer(-ID)
df %>%
pivot_longer(-ID) %>%
left_join(imp_long, by = c("ID", "name")) %>%
mutate(var1 = coalesce(value.x, value.y)) %>%
select(-c(value.x, value.y)) %>%
pivot_wider(names_from = "name", values_from = "var1")
輸出
# A tibble: 5 × 4
ID var1 var2 var3
<dbl> <dbl> <dbl> <dbl>
1 1 1 3 6
2 2 5 1 2
3 3 3 2 5
4 4 6 6 4
5 5 3 6 3
uj5u.com熱心網友回復:
您可以使用 -
library(dplyr)
mode_data <- imp %>%
group_by(ID) %>%
summarise(across(starts_with('var'), Mode))
df %>%
left_join(mode_data, by = 'ID') %>%
transmute(ID,
across(matches('\\.x$'),
function(x) coalesce(x, .[[sub('x$', 'y', cur_column())]]),
.names = '{sub(".x$", "", .col)}'))
# ID var1 var2 var3
#1 1 1 3 6
#2 2 5 1 2
#3 3 3 2 5
#4 4 6 6 4
#5 5 3 6 3
mode_data每var列都有 Mode 值。- 加入
df并mode_data通過ID。 - 由于所有對的名稱中都有
name.x和name.y,我們可以將所有name.x對替換為x,y以獲得相應的列對。(.[[sub('x$', 'y', cur_column())]]) - 使用
coalesce選擇每對中的非NA值。 - 通過
.x從名稱中洗掉來更改列名稱。({sub(".x$", "", .col)}) 所以var1.x變成只有var1。
其中Mode功能取自這里
Mode <- function(x) {
ux <- unique(x)
ux[which.max(tabulate(match(x, ux)))]
}
uj5u.com熱心網友回復:
library(dplyr, warn.conflicts = FALSE)
imp %>%
group_by(ID) %>%
summarise(across(everything(), Mode)) %>%
bind_rows(df) %>%
group_by(ID) %>%
summarise(across(everything(), ~ coalesce(last(.x), first(.x))))
#> # A tibble: 5 × 4
#> ID var1 var2 var3
#> <dbl> <dbl> <dbl> <dbl>
#> 1 1 1 3 6
#> 2 2 5 1 2
#> 3 3 3 2 5
#> 4 4 6 6 4
#> 5 5 3 6 3
由reprex 包(v2.0.1)于 2022 年 1 月 3 日創建
Mode <- function(x) {
ux <- unique(x)
ux[which.max(tabulate(match(x, ux)))]
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/403212.html
標籤:
