如何将列中的0重新编码为列的中位数

时间:2017-05-26 19:27:43

标签: r

嗨我在R中的数据帧中有一列,其中包含0

Sample -
mdfam0
25870
28670
21345
85100
0

它的右倾斜,我希望它被列的中值替换。

我正在学习用R做数据清理。任何帮助都会很棒。

5 个答案:

答案 0 :(得分:2)

所以你有一个data.frame:

x=data.frame("mdfam0"=c(25870,28670,21345,85100,0))
> x
  mdfam0
1  25870
2  28670
3  21345
4  85100
5      0

如果您希望所有0都是整列的中位数,请使用

> x$mdfam0[x$mdfam0==0]=median(x$mdfam0) #wherever x$mdfam0 is 0, change that value to the median of x$mdfam0
> x
  mdfam0
1  25870
2  28670
3  21345
4  85100
5  25870

相反,如果您希望所有0都是大于0的所有数字的中位数,请使用

> x$mdfam0[x$mdfam0==0]=median(x$mdfam0[x$mdfam0>0]) #wherever x$mdfam0 is 0, change that value to the median of all numbers greater than 0
> x
  mdfam0
1  25870
2  28670
3  21345
4  85100
5  27270

答案 1 :(得分:1)

使用data.table

library(data.table)
setDT(Sample)

Sample[ , mdfam0 := {
  V = mdfam0
  idx = V == 0
  med = median(V[!idx])
  V[idx] = med
  V
}]

或者

Sample[mdfam0 == 0, mdfam0 := Sample[mdfam0 > 0, median(mdfam0)] ]

答案 2 :(得分:0)

Sample$mdfam0[Sample$mdfam0==0] = median(Sample$mdfam0[Sample$mdfam0!=0])

编辑:

RHS:方括号内的东西有助于提取列的非零元素。调用median函数来计算这些元素的中位数。

LHS:方括号内的东西有助于隔离列中的0。

将它们设置为相等的集合将0替换为中位数。

答案 3 :(得分:0)

一种选择是使用na.aggregate中的zoo并将FUN指定为median

library(zoo)
library(tidyverse)
df1 %>%
     mutate(Sample = na.aggregate(replace(Sample, Sample == 0, NA), FUN = median))
#  Sample
#1 mdfam0
#2  25870
#3  28670
#4  21345
#5  85100
#6  28670

答案 4 :(得分:0)

Sample = data.frame("mdfam0" = c(25870, 28670, 21345, 85100, 0))
Sample %>% 
  dplyr::mutate(mdfam0 = ifelse(mdfam0 == 0, NA, mdfam0), 
                mdfam0 = ifelse(is.na(mdfam0), median(mdfam0, na.rm = TRUE), mdfam0))