【问题标题】:How to for loop on each column and do mean imputation using a function in R如何在每列上循环并使用 R 中的函数进行平均插补
【发布时间】:2017-01-21 00:42:22
【问题描述】:

如何使用 colMedian 函数计算 colMedian。我收到一个错误:参数“x”必须是矩阵或向量。

col_medians <- round(colMedians(impute_marks[,-1], na.rm=TRUE),0)
k <- which(is.na(impute_marks), arr.ind=TRUE)
impute_marks[k] <- col_medians[k[,-1]]

我需要对数据框中除第一列以外的所有列执行以下操作。 下面的代码工作正常。但是我在for循环中循环时会报错unknown courses。

impute_marks$c1[is.na(impute_marks$c1)] <- round(mean(impute_marks$c1[!is.na(impute_marks$c1)]),0)

这里,impute_marks 是数据集的名称,c1 是列名。

使用上述操作,我能够找到平均值并替换 c1(列)中的所有 NA 值。但我有 30 多列。如何在 for 循环中编写上述操作以循环遍历每门课程并将 NA 值替换为平均值?

我的操作功能:

impute_marks$F27SA[is.na(impute_marks$F27SA)] <- round(mean(impute_marks$F27SA[!is.na(impute_marks$F27SA)]),0)

imputing_using_mean <- function()
{
    courses <- names(impute_marks)[2:26]  
    for(i in seq_along(courses))
    {
      impute_marks$courses[[i]][is.na(impute_marks$courses[[i]])] <- round(mean(impute_marks$courses[[i]][!is.na(impute_marks$courses[[i]])]),0)
    }
}

imputing_using_mean()

【问题讨论】:

    标签: r function loops


    【解决方案1】:

    与@Aaron 的回答基本相同 Replace NA values by row means 。已针对第一列进行了调整。

    marks <- read.table(text="
      a  1 NA  3
      b  1  2  3
      c NA NA NA
      ")
    col_means <- round(colMeans(marks[,-1], na.rm=TRUE), 0)
    k <- which(is.na(marks), arr.ind=TRUE)
    marks[k] <- col_means[k[,2]-1]
    
    #  V1 V2 V3 V4
    #1  a  1  2  3
    #2  b  1  2  3
    #3  c  1  2  3
    

    【讨论】:

    • 这意味着行吗?我需要列元素的方法
    • 我尝试了前两个语句的工作。直到 k,它将列的所有索引存储在向量中。但是最后一个向向量输入平均值的语句似乎不起作用
    • 编辑为使用列方式而不是行方式
    • 我有一个类似的中位数查询,我试过了,但它似乎给出了一个错误,请你帮忙。我将更新我的中位数问题。请看一下
    • 好的。谢谢,我能够解决中位数的解决方案。我必须先将其转换为 as.matrix。做手术
    【解决方案2】:

    以下是计算每列的中位数并将每个 NA 值替换为为每列计算的中位数的解决方案。均值也是如此,但不需要将其转换为矩阵的步骤。

    # first convert it to matrix
    matrix_marks <- as.matrix(impute_marks)
    
    $calculate the median for each column
    col_medians <- round(colMedians(matrix_marks[,-1], na.rm=TRUE),0)
    
    #get the index for each NA values
    k <- which(is.na(matrix_marks), arr.ind=TRUE)
    
    finally replace those values with median value.
    matrix_marks[k] <- col_medians[k[,-1]]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-02-24
      • 2022-01-05
      • 2022-01-14
      • 2014-10-22
      • 2017-02-13
      • 2021-12-12
      • 1970-01-01
      • 2013-06-22
      相关资源
      最近更新 更多