Как сохранить несколько результатов с разными типами (числовые и символьные)? - PullRequest
0 голосов
/ 07 января 2019

Я знаю, что такого рода вопросы задавались ранее, но я не смог применить предложенные решения к моему набору данных ... У меня есть действительно простая функция для сбора различных данных в больший размер (около 7 столбцов и 150 000 строк). Моя задача - сохранить собранные данные. Действительно, у меня есть несколько строковых символов, а также цифры и время.

 Location   Date Creneau Ordre              Name         Qte_conso    Start        End
case 2 18/12/2018       6     1         Caligula Time         0     06:28:35     06:28:35
case 2 18/12/2018       6     2         Lolita Forest       500     07:52:34     08:02:02
case 2 18/12/2018       6     3       Break The Wall       501     08:05:43     08:10:04
case 2 18/12/2018       6     4         Lolita Forest         0     08:10:55     08:11:35
case 2 18/12/2018       6     5          I Know you       501     08:12:43     08:24:26
case 2 18/12/2018       6     6         Caligula Time         0     08:24:39     08:24:39
case 2 18/12/2018       6     7             Aroma         421     08:34:37     08:40:56
case 2 18/12/2018       6     8             Polenta         0     08:41:44     08:41:45
case 2 18/12/2018       6     9             Aroma          79     08:41:49     08:45:43
case 2 18/12/2018       6    10            Polenta       500     08:46:54     08:58:23
case 2 18/12/2018       9     1           I Know you       501     09:03:09     09:11:17
case 2 18/12/2018       9     2             Polenta        500     09:12:03     09:25:34
case 2 18/12/2018       9     3             Decided       500     09:28:15     09:47:34
case 2 18/12/2018       9     4       Lolita Forest       500     09:48:05     09:56:49
case 2 18/12/2018       9     5          Diamond Free       500     09:57:07     10:07:23
time.interval
    0 secs
    568 secs
    261 secs
    40 secs
    703 secs
    0 secs
    379 secs
     1 secs
   234 secs
   689 secs
   488 secs
   811 secs
   1159 secs
   524 secs
   616 secs

В каждой строке указывается, в какое время и сколько съели животное. Затем у меня есть несколько рядов для уникального животного.

У меня есть следующий код для сбора необходимой мне информации (это должен быть более эффективный способ сделать это, но, по крайней мере, это работает, я проверил, напечатав вывод на нескольких людях):

 names <- unique(dataset$Nom)
 dates <- unique(dataset$Date)
 crnx <- unique(dataset$Creneau)

for (name in names){
 for (date in dates) {
   for (crn in crnx) {

   res <- subset(dataset, Nom==name & Date==date & Creneau==crn)
   nbPassage <- nrow(res) 
   qteMax <- max(res$Qte_conso)
   qteMin <- min(res$Qte_conso)
   qteTot <- sum(res$Qte_conso)
   qteMoy <- mean(res$Qte_conso)

   tempsMin <- min(res$interval)
   tempsMax <- max(res$interval)
   tempsTot <- sum(res$interval)
   tempsMoy <- mean(res$interval)
   }
 }
}

Я попытался поместить все эти данные в пустой кадр данных, инициализированный следующим образом:

df <- data.frame(Nom=character(),
             Date=character(),
             Case=character(),
             Creneau=numeric(),
             Passage=numeric() ,
             Qte_min=numeric(),
             Qte_max=numeric(),
             Qte_tot=numeric(),
             Qte_moy=numeric(),
             Tps_min=character(),
             Tps_max=character(),
             Tps_tot=character(),
             Tps_moy=character(),
             stringsAsFactors=FALSE)

for (name in names){
  for (date in dates) {
    for (crn in crnx) {

    res <- subset(dataset, Nom==name & Date==date & Creneau==crn)
    [...]

    }
  }
df$Nom <- df$Nom + name
   df$Date <- df$Date + date
   df$Creneau <- df$Creneau + crn
   df$Passage <- df$Passage + nbPassage

   df$Qte_min <- df$Qte_min + qteMin
   df$Qte_max <- df$Qte_max + qteMax
   df$Qte_tot <- df$Qte_tot + qteTot
   df$Qte_moy <- df$Qte_moy + qteMoy

   df$Tps_min <- df$Tps_min + tempsMin
   df$Tps_max <- df$Tps_max + tempsMax
   df$Tps_tot <- df$Tps_tot + tempsTot
   df$Tps_moy <- df$Tps_moy + tempsMoy
}

С этим я получаю Error in df$Nom + name : non-numeric argument to binary operator

Я также пробовал с векторами (я красный, это не очень хорошая практика, но я не знаю, как поступить), зная, сколько строк мне нужно получить, но тогда у меня было integer(0) для всех числовых однократных и точно таких же сообщений об ошибках для одного, содержащего строки символов.

Я также пытался capture.output, но у меня только первый элемент.

Конечная цель всего этого - иметь возможность экспортировать новый фрейм данных в файл CSV.

Заранее спасибо тем, кто найдет время прочитать и, возможно, ответит на это. Если вам нужна дополнительная информация, я был бы рад предоставить вам больше элементов.

Ответы [ 2 ]

0 голосов
/ 07 января 2019

Похоже, что вы хотите сделать просто группу с помощью операции . Вы можете использовать пакет data.table (а также dplyr) для выполнения этой операции.

Допустим, у меня есть data.frame животных с именами animal_names, которые едят определенное количество пищи quantity в каждый период времени (я опускаю переменную времени для краткости):

animal_names <- c(rep("Pierre", 2), rep("Jean", 4))
quantity     <- runif(n = 6, min = 1, max = 10)
df           <- data.frame(names = animal_names, quantity = quantity)

что дает:

 > df
   names quantity
1 Pierre 7.620816
2 Pierre 2.754536
3   Jean 2.591135
4   Jean 4.013869
5   Jean 3.865716
6   Jean 7.888450

Вместо зацикливания на unique(names) и вычисления совокупных показателей, таких как max(quantity), mean(quantity) и т. Д., Вы можете группировать операции. Используя пакет data.table, вы можете сделать следующее:

dt <- data.table(df) #to convert the data.frame object into a data.table
summary_df <- dt[, .(
  min_qty = min(quantity),
  max_qty = max(quantity),
  mean_qty = mean(quantity),
  sum_qty = sum(quantity)
), by = names]

, что дает:

> summary_df
    names  min_qty  max_qty mean_qty  sum_qty
1: Pierre 2.754536 7.620816 5.187676 10.37535
2:   Jean 2.591135 7.888450 4.589792 18.35917

Затем экспортируйте эти data.table в функцию write.csv. Если вы хотите работать с этой таблицей, но не знаете синтаксиса data.table, вы всегда можете перевести ваш объект обратно в data.frame, используя команду: summary_df <- data.frame(summary_dt).

0 голосов
/ 07 января 2019

Для этого есть много опций dplyr, но с базой R вы можете использовать by, например:

by(dataset[, c("Qte_conso", "interval")], dataset[c("name", "date", "crn")], function(x) with(x, data.frame(qteMax=max(Qte_conso), qteMin=min( ....

Рабочий пример с надуманными данными:

df <- data.frame(g1=sample(1:3, 100, replace=T), g2=sample(1:2, 100, replace=T), b=rnorm(100), c=rnorm(100))
foo <- by(df[, c("b", "c")], df[c("g1", "g2")], function(x) 
  c(len = nrow(x), minb=min(x$b), maxb=max(x$b), minc=min(x$c), maxc=max(x$c)))
do.call(rbind, foo)
cbind( expand.grid(attr(foo, "dimnames")), do.call(rbind, foo))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...