在分组的数据帧上生成“ ecdf”

时间:2019-02-04 15:06:49

标签: r dplyr

如何存储分组数据帧中的ecdf输出

大家好,

我的数据如下:

age lab  value  
20  wbc  7.0   
20  wbc  6.5
20  rbc  3.5
30  rbc  4.0
30  plt  100
30  plt  120
40  wbc  5.0
40  wbc  7.5
40  rbc  4.1
... ...  ...

我想为所有可能的“年龄”-“实验室”组合生成和存储变量“值”的ecdf。输出应为“ ecdf”对象的列表。我计划在以后的分析中使用这些ecdf,并将其应用于另一个数据集。

到目前为止我尝试过的:

data %>% group_by(age,lab) %>% do(ecdf(.$value))

到目前为止没有成功。我得到了:

Error: Results 1, 2, 3, 4, 5, ... must be data frames, not ecdf/stepfun/function

有什么想法吗?

解决了

如果这对任何人都有帮助,我将原始数据帧分为两个因素,然后在第三列上使用lapply。

spl <- split(data, list(data$age, data$lab))
ecdfs <- lapply(spl, function(x) ecdf(x$value)

1 个答案:

答案 0 :(得分:1)

我们可以使用

library(dplyr)
data %>% 
  group_by(age, lab) %>%
  do(data.frame(., newval = ecdf(.$value)(.$value)))

或与mutate

data %>% 
   group_by(age, lab) %>% 
   mutate(newval = ecdf(value)(value))
# A tibble: 9 x 4
# Groups:   age, lab [6]
#    age lab   value newval
#  <int> <chr> <dbl>  <dbl>
#1    20 wbc     7      1  
#2    20 wbc     6.5    0.5
#3    20 rbc     3.5    1  
#4    30 rbc     4      1  
#5    30 plt   100      0.5
#6    30 plt   120      1  
#7    40 wbc     5      0.5
#8    40 wbc     7.5    1  
#9    40 rbc     4.1    1  

更新

如果我们要将函数存储为列,则将其包装在list

data %>% 
    group_by(age, lab) %>% 
    mutate(ecdfFun = list(ecdf(value)))

也可以summarise d

data %>%
   group_by(age, lab) %>%
   summarise(ecdfFun = list(ecdf(value)))

数据

data <- structure(list(age = c(20L, 20L, 20L, 30L, 30L, 30L, 40L, 40L, 
 40L), lab = c("wbc", "wbc", "rbc", "rbc", "plt", "plt", "wbc", 
 "wbc", "rbc"), value = c(7, 6.5, 3.5, 4, 100, 120, 5, 7.5, 4.1
 )), class = "data.frame", row.names = c(NA, -9L))