मैं अपने सभी नंबरों को बदलना चाहूंगा 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)