嘿伙计们我正在研究一个非常大的数据集(200列,750,000行)。 有几个单元格的值为-1,我希望根据该特定列的模式(最高重复值)替换每个单元格,而不是所有-1的标准内容。例如,A列中的-1替换为A列上的模式,B列中的-1替换为B列的模式。
有没有办法处理这个问题,而不必使用if函数创建新的200列和750,000行?
感谢您的时间。
此致 InWoords
答案 0 :(得分:3)
我们可以使用here
中的Mode
功能
Mode <- function(x) {
ux <- unique(x)
ux[which.max(tabulate(match(x, ux)))]
}
然后,使用mutate_all
replace
-1
的值与每列的'模式'
library(dplyr)
df1 %>%
mutate_all(funs(replace(., .== -1, Mode(.))))
不清楚-1是否作为列中最常见的值出现。在那里排除mutate_all
df1 %>%
mutate_all(funs(replace(., .== -1, Mode(.[. != -1]))))
此外,如果列中没有-1,那么我们可以使用mutate_if
跳过那些
df1 %>%
mutate_if(funs(any(.==-1)),funs(replace(., .== -1, Mode(.[. != -1]))))
df1 <- structure(list(V1 = c(1L, 0L, 3L, 2L, 3L, 5L, 0L, 4L, 4L, 0L),
V2 = c(3L, 1L, 3L, 3L, 1L, 5L, 0L, -1L, 2L, -1L), V3 = c(-1L,
2L, 4L, -1L, 0L, 3L, -1L, 3L, 3L, -1L), V4 = c(1L, 0L, 1L,
0L, 5L, 0L, 4L, 3L, 3L, 5L), V5 = c(2L, 1L, 0L, 0L, -1L,
-1L, 1L, 1L, 0L, 1L)), .Names = c("V1", "V2", "V3", "V4",
"V5"), row.names = c(NA, -10L), class = "data.frame")