簡體   English   中英

為什么沒有突變填充所有行? 正在使用mutate和ifelse從另一個數據幀中查找估算值

[英]Why didn't mutate fill all rows? Was using mutate and ifelse to look up imputed values from another dataframe

這是交易。 如果原始數據幀中的v變量為NA ,則嘗試使用plyr包中的mutate從另一個數據幀中查找適當的值。 查找值應該輸入到一個新的imputed變量中。 我還為此目的定義了一個自定義函數。

這是代碼:

if(!require(plyr)){
  install.packages("plyr")
  library(plyr)
}
df = data.frame(d=c(1,1,1,2,2,2,3,3,3),
                g=rep(c(1,2,3),3),
                v=c(5,NA,NA,5,NA,NA,5,NA,NA))
imputed = data.frame(g=c(1,2,3),
                     v=c(5,10,15))
getImputed = function(p){
  imputed[imputed$g==p,"v"]
}
df = mutate(df,imputed=ifelse(is.na(v),getImputed(g),v))
df

這是結果數據框:

  d g  v imputed
1 1 1  5       5
2 1 2 NA      10
3 1 3 NA      15
4 2 1  5       5
5 2 2 NA      NA
6 2 3 NA      NA
7 3 1  5       5
8 3 2 NA      NA
9 3 3 NA      NA

可以看到,只有前3行被mutate成功填寫。 ifelse函數可能是問題所在,但我不明白為什么:(

奇怪的是,如果imputed數據幀有4行,如下所示:

imputed = data.frame(g=c(1,2,3,4),
                     v=c(5,10,15,20))

然后df數據幀已正確填充:

  d g  v imputed
1 1 1  5       5
2 1 2 NA      10
3 1 3 NA      15
4 2 1  5       5
5 2 2 NA      10
6 2 3 NA      15
7 3 1  5       5
8 3 2 NA      10
9 3 3 NA      15

但是R警告我說:

Warning message:
In imputed$g == p :
  longer object length is not a multiple of shorter object length

我在俯視什么嗎?

問題是您的getImputed函數。 mutate函數不會遍歷行。 它將列作為向量傳遞給函數,因此每個函數基本上稱為一個。 如果您傳遞單個值,則getInputed函數將起作用,但對於矢量而言則不太理想

getImputed(1)
# [1] 5

getImputed(c(1,2))
# [1] 5 10
# Warning message:
# In imputed$g == p :
#   longer object length is not a multiple of shorter object length

編寫函數的更好方法是

getImputed2 <- function(p){
  imputed$v[match(p, imputed$g)]
}

這將正確處理值的向量

mutate(df,imputed=ifelse(is.na(v),getImputed2(g),v))
#   d g  v imputed
# 1 1 1  5       5
# 2 1 2 NA      10
# 3 1 3 NA      15
# 4 2 1  5       5
# 5 2 2 NA      10
# 6 2 3 NA      15
# 7 3 1  5       5
# 8 3 2 NA      10
# 9 3 3 NA      15

您也可以考慮加入和替換

mutate(join(df, setNames(imputed, c("g","v2")), by=c(g="g")), 
    v=ifelse(is.na(v), v2, v), v2=NULL)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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