Как исправить «неверный уровень фактора»? - PullRequest
0 голосов
/ 17 мая 2019

Я не могу запустить среднюю функцию. Вот мой код:

Я однажды успешно попробовал фактор-функцию (data $ date). Оболочка отвечает, что она состоит из 890 входов из 51 уровня.

   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

Большое спасибо

Ответы [ 2 ]

0 голосов
/ 17 мая 2019

Я не уверен, что линия 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 : Пытаясь перепроектировать ваш код за пределы заданного вами вопроса, возможно, вы хотите вычислить среднее значение Eau для каждой комбинации Date и Traitement. В этом случае я бы предложил вам dplyr и tidyr из потрясающего набора пакетов 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/

0 голосов
/ 17 мая 2019

tata является фактором data.frame, и вы хотите вставить число внутри try

tata <- data.frame("Aucun","Augmentation","Interception" ,stringsAsFactors = F)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...