2016-11-11 55 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