#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
вызове :). Вы можете оставить его безымянным.