嗨我在R中的数据帧中有一列,其中包含0
Sample -
mdfam0
25870
28670
21345
85100
0
它的右倾斜,我希望它被列的中值替换。
我正在学习用R做数据清理。任何帮助都会很棒。
答案 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))