2016-11-11 98 views
0

我希望在具有某些条件的连接字符串上平均值。这是我的数据:在某些条件下连接字符串的平均值

id path events 

1 a, b 2, 3 
2 c, a 3, 4 
3 b  5 

我想借此行的平均水平是有一个特定的路径,例如谁没有C(即1行3)行的平均值(2 + 3 + 5)/ 3 = 3.33

和类似的其他人,所以我的期望的输出将是

path avg 
a  5 
b  3.5 
c  3.33 
之前,我试图不连接数据

和它的工作

output <- sapply(as.character(unique(df$path)), 
       function(x) mean(subset(df, !path %in% x)$events)) 

但不能想出一个主意,这种情况

这是我的数据

mydata <- data.frame(id =c(1,2,3), 
        path= c("a,b", "c,a", "b"), 
        events =c (("2,3"), ("3,4"), ("5"))) 
+0

您可以使用'tidyr :: separate_rows'来取消您的数据,但我不确定遵循了您的汇总逻辑。 – alistaire

+0

@alistaire谢谢('我正在试验这个。我的summeriziation逻辑在上面举例说明,例如c,我们把包含c的行放在一边,所以我们删除第2行(有c)并保留第1行和第3行,第1行和第3行中的所有事件是2 + 3 + 5/3 = 3.33 – MFR

回答

3

这里有一个tidyverse方法:

library(tidyverse) 

mydata %>% separate_rows(path, events, convert = TRUE) %>% # unnest rows 
    group_by(path) %>% # set grouping 
    summarise(avg = mean(.$events[!.$id %in% id])) # summarize groups 

## # A tibble: 3 × 2 
## path  avg 
## <chr> <dbl> 
## 1  a 5.000000 
## 2  b 3.500000 
## 3  c 3.333333 

注意总结使用.$[column name]指到整个列,并且只需[column name]来引用该组的值。

+0

这很奇怪,是否给你一个错误信息?你实际上可以直接使用'library(tidyr); library(dplyr)',if – alistaire

+0

如果您的路径和事件编号在行中不相同,您需要修改@alistaire解决方案,而不是'separate_rows(events,convert = TRUE)''使用'separate_rows(path ,convert = TRUE)%>%separate_rows(events,convert = TRUE)' – kwicher

+0

@alistaire它很奇怪,最后我成功安装了这个软件包,但是你的代码给了我这个错误错误(x,ties.method =“first” ,na.last =“保持”): 参数“x”丢失,wi没有默认 – MFR