【问题标题】:How to fix 'invalid factor level'?如何修复“无效因子水平”?
【发布时间】:2019-05-17 08:35:51
【问题描述】:

我无法运行平均函数。这是我的代码:

我已经成功地单独尝试了 factor(data$date) 函数。 shell回答它是由51个级别的890个条目组成的。

   data <- read.table("R/DATA.csv", sep = ";", header = TRUE, dec = ",")
   View(data)
   colnames(data)[1] <- "Date"
   eau <- data$"Tension"
   eaucalculee <- ( 0.000616 * eau - 0.1671) * 100
   data["Eau"] <- eaucalculee
     tata <- data.frame("Aucun","Augmentation","Interception")

   tata[1,1]<-mean(data$Eau[data$Date == levels(factor(data$Date))[1]& 
   data$Traitement == "Aucun"])

我希望 tata 数据框的第一列第一行填充平均值,但实际上我收到此错误消息:

   In `[<-.factor`(`*tmp*`, iseq, value = 8.6692) :
   invalid factor level, NA generated 

你能帮帮我吗?

您可以在那里找到 csv 文件:https://drive.google.com/file/d/1zbA25vajouQ4MiUF72hbeV8qP9wlMqB9/view?usp=sharing

非常感谢

【问题讨论】:

    标签: r dataframe factors levels


    【解决方案1】:

    我不确定tata &lt;- data.frame("Aucun","Augmentation","Interception") 行是否符合您的预期。如果您使用 View(tata) 检查其结果,您将看到一个数据框,其中包含一条记录和 3 列,其 values 是您的 3 个字符串(转换为因子,如 @s-brunel 所说)。列名是从它们的值推断出来的(X.Aucun. 等)。我猜你宁愿创建一个列名是给定字符串的数据框。

    建议的代码,带 cmets

    data <- read.table("R/DATA.csv", sep = ";", header = TRUE, dec = ",")
    
    # The following is useless since first column is already named Date
    # colnames(data)[1] <- "Date"
    
    # No need to create your intermediate variables eau and eaucalculee: you can 
    # do it directly with the data frame columns
    data$Eau <- ( 0.000616 * data$Tension - 0.1671) * 100
    
    # No need to create your tata data frame before filling its actual content, you
    # can do it directly
    tata <- data.frame(
      Aucun = mean(data$Eau[
        data$Date == levels(factor(data$Date))[1] & data$Traitement == "Aucun"
        ])
      )
    tata$Augmentation = your_formula_here
    tata$Interception = your_formula_here
    

    注意 1:引用数据框列的最简单方法是使用 $,您不需要使用任何双引号。您也可以将[[ 与双引号(等效)一起使用,但请注意[,它将返回一个包含单列的数据框:

    class(data$Date)
    # [1] "factor"
    class(data[["Date"]])
    # [1] "factor"
    class(data["Date"])
    # [1] "data.frame"
    class(data[ , "Date"])
    # [1] "factor"
    

    注意 2:尝试对您的代码进行逆向工程,超出您提出的问题,也许您想计算每个 Date 和 Traitement 组合的 Eau 的平均值。在这种情况下,我会建议您从一组很棒的软件包 tidyverse 中选择 dplyrtidyr

    # install.packages("tidyverse") # if you don't already have it
    library(tidyverse)
    
    data <- data %>% 
      mutate(Eau = ( 0.000616 * data$Tension - 0.1671) * 100)
    
    tata_vertical <- data %>% 
      group_by(Date, Traitement) %>% 
      summarise(mean_eau = mean(eau))
    View(tata_vertical)
    
    tata <- tata_vertical %>% spread(Traitement, mean_eau)
    View(tata)
    

    很多关于https://www.tidyverse.org/learn/的文档

    【讨论】:

    • 感谢您的友好回答,它成功了。实际上我选择使用一个 for 循环来为每个循环做平均值
    • 太棒了。如果满意,别忘了接受答案(检查左边的标志)
    【解决方案2】:

    tata 是一个因子 data.frame,你想在里面插入一个数字 试试

    tata <- data.frame("Aucun","Augmentation","Interception" ,stringsAsFactors = F)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-12-07
      • 2013-10-28
      • 1970-01-01
      • 2012-10-14
      • 1970-01-01
      • 1970-01-01
      • 2019-08-26
      • 1970-01-01
      相关资源
      最近更新 更多