首页 > 解决方案 > 如何修复“无效因子水平”?

问题描述

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

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

非常感谢

标签: rdataframefactorslevels

解决方案


我不确定这条线tata <- data.frame("Aucun","Augmentation","Interception")是否符合您的预期。如果您检查它的结果,View(tata)您将看到一个包含一条记录和 3 列的数据框,其是您的 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:引用数据框列的最简单方法是使用$并且您不需要使用任何双引号。您也可以使用[[双引号(等效),但要注意[它会返回带有单列的数据框:

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 的平均值。在这种情况下,我会建议您dplyrtidyr从一组很棒的软件包中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)

https://www.tidyverse.org/learn/上有很多文档


推荐阅读