【问题标题】:Replace all NA values with the (minimum value/2) value for each column, in large 6000+ column dataset在大型 6000+ 列数据集中,将所有 NA 值替换为每列的(最小值/2)值
【发布时间】:2020-01-02 01:53:05
【问题描述】:

我需要用列中的最小值除以 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
}

【问题讨论】:

  • 您收到错误是因为您试图为一个字符列(第一列)除以 2,这应该这样做: lapply(data[2:4], function(x) replace(x, is.na(x), min(x, na.rm = TRUE) / 2))

标签: r replace min na calculation


【解决方案1】:

您应该只在数字列上应用该函数。此处忽略第一列 (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,它会自动选择数字列

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

【讨论】:

  • 解决了它 - 我没有意识到包含字符的列会导致问题。谢谢@Ronak Shah
猜你喜欢
  • 1970-01-01
  • 2020-04-21
  • 1970-01-01
  • 2014-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-25
  • 2021-08-30
相关资源
最近更新 更多