我想将功能应用于同一组中的所有项目对,例如
示例输入:
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
我尝试使用dplyr软件包中的summary来执行此操作,但这只能在输出为单个值时使用。
答案 0 :(得分:4)
我们可以为每个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
答案 1 :(得分: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
如果我们想在OP的帖子中使用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))