2017-02-09 59 views
1

我的問題:在單獨的列替換與其他值不同的列分組的NA值

Tom_dog <- c(1,4,NA,6,10,5) 
Joe_dog <- c(2,NA,8,10,12,5) 
Theo_dog <- c(5,1,6,8,NA,7) 
Gus_cat <- c(9,10,14,12,13,NA) 
Walz_cat <- c(NA, 9,8,7,4,2) 
Ron_cat <- c(15,13,NA,2,5,6) 
df <- data.frame(Tom_dog,Joe_dog,Theo_dog,Gus_cat,Walz_cat,Ron_cat) 

我計算平均值的狗和貓,並將其連接到數據幀中的新列

df$dog_mean <- rowMeans(df[ , grepl("^.+(_dog)$", colnames(df))], na.rm = TRUE) 
df$cat_mean <- rowMeans(df[ , grepl("^.+(_cat)$", colnames(df))], na.rm = TRUE) 

現在,我想要做的是取代狗的NA值,同一行中的狗的平均值。在第二步中,貓與貓一樣。 我想事端這樣,但沒有奏效:

df[ , grepl("^.+(_dog)$", colnames(df))][is.na(df[ , grepl("^.+(_dog)$", colnames(df))])] 
<- df$dog_mean[is.na(df[ , grepl("^.+(_dog)$", colnames(df))])] 

幫助非常感謝!

回答

1

在基礎R,您可以用lapply兩遍做到這一點:

# dogs 
df[, grepl("_dog", names(df))] <- lapply(df[, grepl("_dog", names(df))], 
             function(i) {i[is.na(i)] <- df$dog_mean[is.na(i)]; i}) 
# cats 
df[, grepl("_cat", names(df))] <- lapply(df[, grepl("_cat", names(df))], 
             function(i) {i[is.na(i)] <- df$cat_mean[is.na(i)]; i}) 

這裏,lapply返回的列表被反饋回data.frame中的相應位置。 {}確保整個代碼塊(兩行,由;分隔)一次執行。

1

而不是試圖在單個步驟中完成轉換,您可能會更好通過lapply調用一次將轉換一列(我在這裏使用magrittr這裏只是爲了保存輸入整個第一行兩次:

library(magrittr) 
df[ , grepl("^.+(_dog)$", colnames(df))] %<>% 
    lapply(function(x, vals) { 
     ifelse(is.na(x), vals, x) 
    }, 
    vals = df$dog_mean) 

與同爲貓科動物:

df[ , grepl("^.+(_cat)$", colnames(df))] %<>% 
    lapply(function(x, vals) { 
     ifelse(is.na(x), vals, x) 
    }, 
    vals = df$cat_mean) 
相關問題