简体   繁体   中英

How to fix 'invalid factor level'?

I can't run a mean function. Here is my code :

I've tried the factor(data$date) function alone successfully. The shell answers that it is made up of 890 entry of 51 levels.

   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"])

I would like that te first column first row of the tata dataframe to be filled with the mean but in fact I get this error message :

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

Could you help me please ?

You may find the csv file there : https://drive.google.com/file/d/1zbA25vajouQ4MiUF72hbeV8qP9wlMqB9/view?usp=sharing

Thank you very much

tata是一个因子data.frame,你想在try中插入一个数字

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

I'm not sure the line tata <- data.frame("Aucun","Augmentation","Interception") does what you expected. If you inspect its result with View(tata) you will see a data frame with one record and 3 columns whose values are your 3 strings (converted to factors, as @s-brunel said). The column names were inferred from their values ( X.Aucun. , etc). I guess you rather wanted to create a data frame whose column names are the given strings.

Suggested code, with comments

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

Note 1 : The easiest way to reference a data frame column is with $ and you don't need to use any double quotes. You can also use [[ with the double quotes (equivalent), but beware of [ which will return a data frame with a single column:

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

Note 2 : Trying to reverse-engineer your code beyond the question you asked, maybe you want to compute the mean value of Eau for each combination of Date and Traitement. In this case, I would suggest you dplyr and tidyr from the awesome set of packages tidyverse :

# 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)

A lot of documentation on https://www.tidyverse.org/learn/

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM