/ / Df में सभी संख्याओं को माध्यिका से बदलें - r, प्रतिस्थापित, ना

सभी संख्याओं को मध्यस्थ द्वारा आरएफ में बदलें, आर, प्रतिस्थापित करें, ना

मैं अपने सभी नंबरों को बदलना चाहूंगा df पंक्ति के मंझले द्वारा, NA मूल्यों को बनाए रखना। यह मेरा इनपुट है:

df <- "pr_id  sample1  sample2 sample3 median
AX-1   NA       120     130  125
AX-2   NA       NA     NA  NA
AX-3   NA       NA     196  196"
df <- read.table(text=df, header=T)

यह मेरी अपेक्षित आउटपुट है:

df <- "pr_id  sample1  sample2 sample3
AX-1   NA       125     125
AX-2   NA       NA     NA
AX-3   NA       NA     196"
df <- read.table(text=df, header=T)

कुछ विचार है कि पूरा करने के लिए?

उत्तर:

उत्तर № 1 के लिए 7

एक संभावित आधार समाधान

indx <- which(!is.na(df[-1]), arr.ind = TRUE) # find non-NA incidents
df[-1][indx] <- df$median[indx[, "row"]] # replace them while subsetting accordingly from df$median
df
#   pr_id sample1 sample2 sample3 median
# 1  AX-1      NA     125     125    125
# 2  AX-2      NA      NA      NA     NA
# 3  AX-3      NA      NA     196    196

और एक बोनस, अगर आपके पास अभी तक मध्यस्थ नहीं हैं, तो यहां उन्हें उड़ने पर शांत करने का एक संभावित तरीका है

df[-1][indx] <- matrixStats::rowMedians(as.matrix(df[-1]), na.rm = TRUE)[indx[, "row"]]

जवाब के लिए 6 № 2

शुद्ध गणित के साथ:

cbind(df[1],NA^(is.na(df[,2:4]))*df$median)

#  pr_id sample1 sample2 sample3
#1  AX-1      NA     125     125
#2  AX-2      NA      NA      NA
#3  AX-3      NA      NA     196

यदि आपको माध्य की गणना करने की आवश्यकता है, तो बस प्रतिस्थापित करें df$median साथ में apply(df[,2:4],1,median,na.rm=TRUE).


जवाब के लिए 5 № 3

आप इस प्रकार से कर सकते हैं

library(dplyr)
mutate_each(df, funs(ifelse(is.na(.), ., median)), sample1:sample3)
#  pr_id sample1 sample2 sample3 median
#1  AX-1      NA     125     125    125
#2  AX-2      NA      NA      NA     NA
#3  AX-3      NA      NA     196    196

यदि आप माध्य गणना को शामिल करना चाहते हैं, तो एक विकल्प यह है कि लंबे प्रारूप में कनवर्ट करें, मध्यस्थों की गणना करें और विस्तृत प्रारूप में फिर से बदलें:

library(tidyr)
gather(df, sample, value, sample1:sample3) %>%
group_by(pr_id) %>%
mutate(value = as.numeric(ifelse(is.na(value), value, median(value, na.rm = TRUE)))) %>%
spread(sample, value)