R 如何将列中的0重新编码为列的中间值

R 如何将列中的0重新编码为列的中间值,r,R,嗨,我在R中的数据帧中有一列,它由0组成 Sample - mdfam0 25870 28670 21345 85100 0 它是右偏的,我想用列的中值替换它 我正在学习使用R进行数据清理。任何帮助都会很好 带有数据。表: library(data.table) setDT(Sample) Sample[ , mdfam0 := { V = mdfam0 idx = V == 0 med = median(V[!idx]) V[idx] = med V }] 或许 Sa

嗨,我在R中的数据帧中有一列,它由0组成

Sample -
mdfam0
25870
28670
21345
85100
0
它是右偏的,我想用列的中值替换它


我正在学习使用R进行数据清理。任何帮助都会很好

带有
数据。表

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)] ]

带有
数据。表

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)] ]

因此,您有一个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

因此,您有一个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
编辑:

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

LHS:方括号内的内容有助于隔离列中的0

将它们设置为相等集将0替换为中间值

编辑:

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

LHS:方括号内的内容有助于隔离列中的0


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

一个选项是使用
na.aggregate
from
zoo
并将
FUN
指定为
中值

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

一个选项是使用
na.aggregate
from
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

考虑是否包含0是很重要的,因为中位数取决于涉及的元素数量。顺便说一句:我写了完全相同的答案。谢谢@matt。但是,我正在处理的列是一个因子变量。数据集是关于芝加哥租金数据的。然后只使用as.numeric(as.character(x$mdfam0))我这样做了-MedIncome=as.numeric((data_rent$mdfamy0))它可以工作。但现在我可以看到N/A,所以我想用中值替换N/A值,然后把它放回原始帧中。因为我将在回归模型中使用此框架。在因子上使用as.numeric()时必须非常小心,因为它默认为因子级别的编号,而不是其值。必须使用as.numeric(as.character())。可以用x$mdfam0[is.NA(x$mdfam0)]=y来替换NA值。考虑是否包含0是很重要的,因为中位数取决于涉及的元素数量。顺便说一句:我写了完全相同的答案。谢谢@matt。但是,我正在处理的列是一个因子变量。数据集是关于芝加哥租金数据的。然后只使用as.numeric(as.character(x$mdfam0))我这样做了-MedIncome=as.numeric((data_rent$mdfamy0))它可以工作。但现在我可以看到N/A,所以我想用中值替换N/A值,然后把它放回原始帧中。因为我将在回归模型中使用此框架。在因子上使用as.numeric()时必须非常小心,因为它默认为因子级别的编号,而不是其值。必须使用as.numeric(as.character())。您可以用x$mdfam0[is.NA(x$mdfam0)]=yc来替换NA值。您可以对这段代码的功能提供一些注释吗?您可以对这段代码的功能提供一些注释吗?