如何修复 '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
:
中的 dplyr
和 tidyr
# 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)
的大量文档
我不能 运行 平均功能。这是我的代码:
我已经成功地单独尝试了 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
:
dplyr
和 tidyr
# 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)
的大量文档