Объединение столбцов при одновременном суммировании значений в R

#r #merge #sum

#r #слияние #сумма

Вопрос:

Мой вопрос прост. Я довольно новичок в R, и у меня есть несколько фреймов данных, выглядящих следующим образом:

 > print(averagetable)
   Group.1 Vigilance   Head-up   Grazing    Browsing     Moving   Grooming Resting      Fleeing
1 cluster1 0.2275285 0.5353896 0.1411797 0.005844156 0.04832251 0.01666667       0 0.0014610390
2 cluster2 0.2718750 0.2506696 0.3174107 0.004241071 0.08125000 0.04174107       0 0.0008928571
3 cluster3 0.3486111 0.4276515 0.1337121 0.012500000 0.03472222 0.01603535       0 0.0027777778
  

Я просто хотел бы выполнить следующие действия:

1) Объединение столбца Browsing в Grazing и суммирование значений для каждой строки. Новому столбцу будет присвоено имя Feeding .

2) Объединение столбца Fleeing в Moving и суммирование значений для каждой строки.

3) Объединение столбцов Vigilance , Grooming и Resting в Head-up и суммирование значений для каждой строки. Новым столбцом будут имена Standing still .

Ожидаемый пример вывода (со значениями вместо формул):

 > print(averagetable)
   Group.1             Standing still                    Moving           Feeding     
1 cluster1  sum(Head-up Vigilance Resting Grooming  sum(Fleeing Moving) sum(Grazing Browsing)
2 cluster2            "                                    "                    "                    
3 cluster3            "                                     "                   "
  

Не мог бы кто-нибудь, пожалуйста, сообщить мне компактный способ преобразования данных? Существует ли специальная функция для объединения и суммирования значений столбцов?

Приветствуется любой вклад!

Комментарии:

1. Пожалуйста, добавьте ожидаемый результат для данного примера.

2. @RonakShah Готово

3. averagetable$Feeding = averagetable$Grazing averagetable$Browsing Это просто суммирование нескольких столбцов, без слияния.

Ответ №1:

 averagetable <- data.frame(averagetable$Head-up   averagetable$Vigilance   averagetable$Resting   averagetable$Grooming,
                           averagetable$Fleeing   averagetable$Moving,
                           averagetable$Grazing   averagetable$Browsing)
colnames(averagetable) <- c('Standing still','Moving','Feeding')
  

Сначала создайте фрейм данных с нужными столбцами, а затем назовите их.

Комментарии:

1. рассмотрите возможность использования, with когда обнаружите, что используете df$... слишком много в одной строке. averagetable <- with(averagetable, data.frame(Head-up Vigilance ...)) . Это сэкономит время ввода и предотвратит опечатки.

2. Вы также можете присвоить своим столбцам имена напрямую с помощью data.frame(`Standing still` = ...)

Ответ №2:

Как указано в комментариях, это всего лишь простое суммирование:

 library(dplyr)
library(data.table)
#dplyr option
averageTable %>% mutate(`Standing Still` = sum(Head.up, Vigilance, Resting, Grooming),
                        Moving = sum(Fleeing, Moving),
                        Feeding = sum(Grazing, Browsing)) %>% select(Group.1, `Standing Still`, Moving, Grazing)

#Even better dplyr option thank @moody_mudskipper(I'm not a tidyverse aficionado) 
averageTable %>% transmute(Group.1, `Standing Still` = sum(Head.up, Vigilance, Resting, Grooming),
                        Moving = sum(Fleeing, Moving),
                        Feeding = sum(Grazing, Browsing))

#data.table option
setDT(averageTable)
averageTable[, .(`Standing Still` = sum(Head.up, Vigilance, Resting, Grooming),
             Moving = sum(Fleeing, Moving),
             Feeding = sum(Grazing, Browsing)), by = "Group.1"]
  

Комментарии:

1. transmute может быть более подходящим, чем mutate здесь (это позволит не вводить имена столбцов дважды).

2. не забудьте Group.1 об transmute вызове :). Вы можете оставить его безымянным.