在超过 6000 列的大型数据集中,将所有 NA 值替换为每列的(最小 value/2)值

Replace all NA values with the (minimum value/2) value for each column, in large 6000+ column dataset

我需要用列中的最小值除以 2 代替 NA,而不是仅仅用平均值代替 NA。(我们的统计学家要求我对我们的数据执行此操作 - 我不是统计学家所以按照他们的指示)

这是我的数据概览:

data

        Group sp.Q13813.SPTN1_HUMAN sp.O14773.TPP1_HUMAN sp.P11137.MTAP2_HUMAN
1 Premutation           10713983468            367492324            2134747097
2 Premutation           10789498495            343303410            2677825476
3 Premutation           11134883489            383589325            2132552280
4 Premutation            9723552595            269965000            2262740921
5 Premutation           11175156282            359864993            1419225650
6 Premutation           10959077349            258095035            3343267633
7 Premutation           10770809133            331554977            2763604046
8 Premutation           11098182537            344384433            2198718886

到目前为止,这是我的代码,但我收到函数调试错误消息:

data_ <- lapply(data, function(x) replace(x, is.na(x), (min(x, na.rm = TRUE)/2)))

Message: function (x, list, values) 
{
  x[list] <- values
  x
}

您应该只在数字列上应用该函数。此处忽略第一列 (Group),因为它不是数字。

cols <- sapply(data, is.numeric)
data[cols] <- lapply(data[cols], function(x) 
                     replace(x, is.na(x), min(x, na.rm = TRUE)/2))

或者使用 dplyr 我们可以使用 mutate_if 这将自动 select 数字列

library(dplyr)
data %>% mutate_if(is.numeric, ~replace(., is.na(.), min(., na.rm = TRUE)/2))