Добавить строку в фрейм данных с суммой данных внутри группы
У меня есть пример данных ниже.
eg_data <- data.frame(
time = c("1", "1", "2","2"),
type = c("long", "short","long", "short"),
size=c(200,50, 500, 150 ))
Мне нужно создать строки, которые составляют значения размера для каждого периода времени. Я посмотрел на комбинации совокупности и по, но я не могу заставить его работать правильно.
Пример того, что я пробовал:
rbind(eg_data, data.frame(time="1 + 2", type="long", size=by(eg_data$size,
eg_data$time=="long", sum)))
Пример того, как я хочу, чтобы итоговый фрейм данных выглядел так:
eg_data <- data.frame(
time = c("1", "1", "2","2", "1 + 2", "1 + 2"),
type = c("long", "short","long", "short", "long", "short"),
size=c(200, 50, 500, 150, 700, 200))
Любая помощь приветствуется, решение с базой R будет действительно оценено.
2 ответа
eg_data <- data.frame(
time = c("1", "1", "2","2"),
type = c("long", "short","long", "short"),
size=c(200,50, 500, 150 ))
library(dplyr)
eg_data %>%
group_by(type) %>% # for each type
summarise(time = paste(time, collapse = " + "), # combine times
size = sum(size)) %>% # get sum of sizes
bind_rows(eg_data, .) # add everything after your original dataset (rows)
# time type size
# 1 1 long 200
# 2 1 short 50
# 3 2 long 500
# 4 2 short 150
# 5 1 + 2 long 700
# 6 1 + 2 short 200
AntoniosK и Hugo получили хорошие ответы через dplyr, я также нашел этот, используя [] и base R
eg_data <- rbind(eg_data, data.frame(time="1 + 2", type="long",
size=sum(eg_data[which(eg_data[,2]=="long"),3])))
eg_data <- rbind(eg_data, (data.frame(time="1 + 2", type="short",
size=sum(eg_data[which(eg_data[,2]=="short"),3]))))
Он занимает две строки, но не так экономно, но добавляет суммы строк к кадру данных и не изменяет никакие другие переменные данные.