Я хочу применить функцию ко всем парам элементов в одной группе, например.
Пример ввода:
Group Item Value
A 1 89
A 2 76
A 3 2
B 4 21
B 5 10
Желаемый результат - это вектор вывода функции для всех элементов в той же группе.
например ради аргументов, если функция была:
addnums=function(x,y){
x+y
}
Тогда желаемый результат будет:
165, 91, 78, 31
Я попытался сделать это, используя sum в пакете dplyr, но это можно использовать только в том случае, если вывод представляет собой одно значение.
да, возобновил вопрос.
Ой, извини. Пропустил это. Спасибо @RonakShah
Мы можем split
Value
для каждого Group
, а затем использовать combn
для вычисления sum
для каждой пары.
sapply(split(df$Value, df$Group), combn, 2, sum)
#$A
#[1] 165 91 78
#$B
#[1] 31
При необходимости в качестве одного вектора мы можем использовать unlist
.
unlist(sapply(split(df$Value, df$Group), combn, 2, sum), use.names = FALSE)
#[1] 165 91 78 31
Если вы заинтересованы в решении tidyverse
, используя ту же логику, что и мы.
library(dplyr)
library(purrr)
df %>%
group_split(Group) %>%
map(~combn(.x %>% pull(Value), 2, sum)) %>% flatten_dbl
#[1] 165 91 78 31
Я пытался сделать это сам, однако это не работает должным образом. Почему group_by()
не работает в этом случае? data %>% group_by(Group) %>% {apply(combn(Value, m=2), 2, sum)}
@ Адамм, хммм ... Я не уверен, что использование apply
будет правильным выбором здесь.
Спасибо, это здорово! Однако я не могу понять, как изменить его для использования с моими дополнительными функциями, а не со встроенной суммой функций.
@Helen, ты можешь использовать это как sapply(split(df$Value, df$Group), function(x) combn(x, 2, function(y) addnums(y[1], y[2])))
Мы можем использовать группу по варианту с data.table
library(data.table)
setDT(df1)[, combn(Value, 2, FUN = sum), Group]
# Group V1
#1: A 165
#2: A 91
#3: A 78
#4: B 31
Если мы хотим использовать addnums
из поста ОП
setDT(df1)[, combn(Value, 2, FUN = function(x) addnums(x[1], x[2])), Group]
# Group V1
#1: A 165
#2: A 91
#3: A 78
#4: B 31
Или с помощью tidyverse
library(dplyr)
library(tidyr)
df1 %>%
group_by(Group) %>%
summarise(Sum = list(combn(Value, 2, FUN = sum))) %>%
unnest
# A tibble: 4 x 2
# Group Sum
# <chr> <int>
#1 A 165
#2 A 91
#3 A 78
#4 B 31
Использование addnums
df1 %>%
group_by(Group) %>%
summarise(Sum = list(combn(Value, 2, FUN =
function(x) addnums(x[1], x[2])))) %>%
unnest
Или используя base R
с aggregate
aggregate(Value ~ Group, df1, FUN = function(x) combn(x, 2, FUN = sum))
df1 <- structure(list(Group = c("A", "A", "A", "B", "B"), Item = 1:5,
Value = c(89L, 76L, 2L, 21L, 10L)), class = "data.frame", row.names = c(NA,
-5L))
Спасибо, это работает хорошо, но для меня очень важно использовать функцию addnums, которую я определил, а не суммировать, есть ли способ добиться этого?
@Helen Спасибо, я обновил пост. Я бы сохранил столбец информации о группе, чтобы правильно идентифицировать значения
На самом деле это не дубликат вопроса, который вы предоставили. Ему нужны суммы каждой пары в группе, а не сумма группы.