将功能应用于同一组中的所有对

时间:2019-05-30 12:29:14

标签: r dplyr

我想将功能应用于同一组中的所有项目对,例如

示例输入:

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来执行此操作,但这只能在输出为单个值时使用。

2 个答案:

答案 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

使用group by选项
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 Raggregate一起使用

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))