首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用中位数替换df中的所有数字

用中位数替换df中的所有数字
EN

Stack Overflow用户
提问于 2016-01-27 10:56:40
回答 3查看 84关注 0票数 2

我想用行的中位数替换df中的所有数字,保持NA值。这是我的意见:

代码语言:javascript
复制
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)

这是我的预期输出:

代码语言:javascript
复制
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)

想办法做到这一点吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-01-27 11:11:51

一种可能的基解

代码语言:javascript
复制
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

还有一个额外的好处,如果你还没有中庸之道,这里有一个可能的方法来计算它们。

代码语言:javascript
复制
df[-1][indx] <- matrixStats::rowMedians(as.matrix(df[-1]), na.rm = TRUE)[indx[, "row"]]
票数 7
EN

Stack Overflow用户

发布于 2016-01-27 11:14:46

用纯数学:

代码语言:javascript
复制
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)即可。

票数 6
EN

Stack Overflow用户

发布于 2016-01-27 11:09:33

使用dplyr可以如下所示:

代码语言:javascript
复制
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

如果要包含中值计算,一个选项是转换为长格式、计算中间值和重转换为宽格式:

代码语言:javascript
复制
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)
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35035383

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档