所以我的数据采用以下格式:
A B C D E F
1 12 NA NA 28 NA NA
2 34 NA NA 29 NA 34
3 98 98 NA 90 NA 67
4 29 34 84 NA NA 67
5 84 NA 29 89 NA 45
6 87 76 28 28 34 67
7 87 23 28 20 24 34
8 32 98 28 49 23 67
9 43 43 27 39 56 30
10 93 23 85 90 46 65
现在我想要以下格式:
A B C D E F
1 12 98 84 28 34 34
2 34 34 29 29 24 67
3 98 NA 28 90 23 67
4 29 76 28 NA 56 45
5 84 23 28 89 46 67
6 87 98 27 28 34
7 87 43 85 20 67
8 32 23 49 30
9 43 39 65
10 93 90
然后我要用该列的中位数填充NA
的剩余部分。
任何人都可以帮助我。我对R非常陌生,对如何实现这一目标感到困惑。
谢谢。
答案 0 :(得分:0)
只能使用基数R来完成此操作。
我将使用名为dat1
和dat2
的数据的副本。前者会将所有非缺失值的中位数估算为缺失值。后者将在计算中值之前从向量中除去顶部和底部的值。
dat1 <- dat2 <- dat # Make two copies of the data
dat1[] <- lapply(dat, function(x){
if(anyNA(x)){
inx <- which(is.na(x))
x[inx] <- median(x, na.rm = TRUE)
c(x[-inx], x[inx])
} else x
})
dat2[] <- lapply(dat, function(x){
if(anyNA(x)){
inx <- which(is.na(x))
x_tmp <- x[-inx]
x[inx] <- median(x_tmp[-c(1, length(x_tmp))], na.rm = TRUE)
c(x[-inx], x[inx])
} else x
})
dat1
# A B C D E F
#1 12 98 84 28 34 34
#2 34 34 29 29 24 67
#3 98 76 28 90 23 67
#4 29 23 28 89 56 45
#5 84 98 28 28 46 67
#6 87 43 27 20 34 34
#7 87 23 85 49 34 67
#8 32 43 28 39 34 30
#9 43 43 28 90 34 65
#10 93 43 28 39 34 65
dat2
# A B C D E F
#1 12 98 84 28 34 34
#2 34 34 29 29 24 67
#3 98 76 28 90 23 67
#4 29 23 28 89 56 45
#5 84 98 28 28 46 67
#6 87 43 27 20 24 34
#7 87 23 85 49 24 67
#8 32 43 28 39 24 30
#9 43 43 28 90 24 65
#10 93 43 28 39 24 67
编辑。
以下功能完成上述两个匿名功能的工作。所需要做的只是将参数设置为适当的值。
请注意,测试会将结果与上面原始结果进行比较。
imputeStat <- function(x, stat = median, remove = c("top", "bottom")){
if(anyNA(x)){
inx <- which(is.na(x))
x_tmp <- x[-inx]
if("top" %in% remove) inx_rem <- 1
if("bottom" %in% remove) inx_rem <- c(inx_rem, length(x[-inx]))
if(is.logical(remove)){
if(!remove) x[inx] <- median(x, na.rm = TRUE)
}else{
x[inx] <- median(x_tmp[-inx_rem], na.rm = TRUE)
}
c(x[-inx], x[inx])
} else x
}
dat3 <- dat
dat3[] <- lapply(dat3, imputeStat, remove = FALSE)
identical(dat1, dat3)
#[1] TRUE
dat4 <- dat
dat4[] <- lapply(dat4, imputeStat)
identical(dat2, dat4)
#[1] TRUE
数据。
dat <- read.table(text = "
A B C D E F
1 12 NA NA 28 NA NA
2 34 NA NA 29 NA 34
3 98 98 NA 90 NA 67
4 29 34 84 NA NA 67
5 84 NA 29 89 NA 45
6 87 76 28 28 34 67
7 87 23 28 20 24 34
8 32 98 28 49 23 67
9 43 43 27 39 56 30
10 93 23 85 90 46 65
", header = TRUE)