[英]R mutate variable to variable values from another observation, using a loop, an ifelse condition and subset (dplyr)
[英]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.