如何修复 'invalid factor level'?

How to fix 'invalid factor level'?

我不能 运行 平均功能。这是我的代码:

我已经成功地单独尝试了 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

非常感谢

tata 是一个因子 data.frame 并且您想在其中插入一个数字 尝试

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

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

建议代码,带注释

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:引用数据框列的最简单方法是使用 $,您不需要使用任何双引号。您也可以将 [[ 与双引号(等效)一起使用,但要注意 [ 这将 return 具有单列的数据框:

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

注意 2:试图 reverse-engineer 你的代码超出你问的问题,也许你想计算每个 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/

的大量文档