将值替换为每列的模式

时间:2017-11-11 16:27:45

标签: r excel azure

嘿伙计们我正在研究一个非常大的数据集(200列,750,000行)。 有几个单元格的值为-1,我希望根据该特定列的模式(最高重复值)替换每个单元格,而不是所有-1的标准内容。例如,A列中的-1替换为A列上的模式,B列中的-1替换为B列的模式。

有没有办法处理这个问题,而不必使用if函数创建新的200列和750,000行?

感谢您的时间。

此致 InWoords

1 个答案:

答案 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")