【问题标题】:argument is not numeric or logical: returning NA in R - How to fix参数不是数字或逻辑:在 R 中返回 NA - 如何修复
【发布时间】:2020-12-24 16:00:19
【问题描述】:

当我尝试在 DF 的 Age 列中添加带有 NA 的第二行并运行代码来清理它时,我得到了一个错误。我想知道如何解决它。我是 R 新手,这个例子来自 Udemy 课程。这不是一个测验问题 - 它是演示文稿的一部分。

我添加了额外的行,因为我想看看代码是否可以工作。

我确实搜索过这个论坛,但找不到我理解的答案。

#create the df cols
Country <- c("France", "Spain", "Germany", "Spain", "Germany", "France", "Spain", "France","Germany", "France")
Age <- c(44, 27, 30, 38, 40, 35, NA, 48, 50, 37)
Salary <- c(72000, 48000, 54000, 61000, NA, 58000, 52000, 79000, 830000, 67000)
Purchased <- c("No","Yes","No","No","Yes","Yes","No","Yes","No","Yes")

#create the df
empdata <- data.frame(Country, Age, Salary, Purchased)

#The logic to set the 'NA' values to the mean  will not work when you add this record, WHY?
empdata[nrow(empdata) + 1, ] = c('Spain', NA , 67000.00, "Yes")


#Run this logic to fix the 'NA' Values
empdata$Age = ifelse(is.na(empdata$Age), 
                     ave(empdata$Age, FUN = function(x) mean(x, na.rm= TRUE)),
                     empdata$Age)

empdata$Salary = ifelse(is.na(empdata$Salary), 
                        ave(empdata$Salary, FUN = function(x) mean(x, na.rm = TRUE)),
                        empdata$Salary)

#view the data
empdata

【问题讨论】:

    标签: r dataframe na


    【解决方案1】:

    这一行

    empdata[nrow(empdata) + 1, ] = c('Spain', NA , 67000.00, "Yes")
    

    将所有内容转换为character,因为向量只能包含一个类。我们可以将它包装在一个list 中,因为list 可以容纳多个type

    empdata[nrow(empdata) + 1, ] = list('Spain', NA , 67000.00, "Yes")
    

    现在我们运行ifelse 并且应该可以工作

    empdata$Age = ifelse(is.na(empdata$Age), 
                          ave(empdata$Age, FUN = function(x) mean(x, na.rm= TRUE)),
                          empdata$Age)
    empdata
    #   Country      Age Salary Purchased
    #1   France 44.00000  72000        No
    #2    Spain 27.00000  48000       Yes
    #3  Germany 30.00000  54000        No
    #4    Spain 38.00000  61000        No
    #5  Germany 40.00000     NA       Yes
    #6   France 35.00000  58000       Yes
    #7    Spain 38.77778  52000        No
    #8   France 48.00000  79000       Yes
    #9  Germany 50.00000 830000        No
    #10  France 37.00000  67000       Yes
    #11   Spain 38.77778  67000       Yes
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-09-21
      • 1970-01-01
      • 2022-01-18
      • 2021-01-29
      • 2020-11-16
      • 2018-08-11
      • 1970-01-01
      相关资源
      最近更新 更多