如何在数据帧列表上执行功能

时间:2015-11-17 08:33:29

标签: r

我有一个数据帧列表如下(即使head = 1,输入也太大了所以我不得不在这里用str(df_list)做一个模型)

$ OC_AH_026C  :'data.frame':    13081 obs. of  3 variables:
  ..$ chr    : num [1:13081] 1 1 1 1 1 1 1 1 1 1 ...
  ..$ leftPos: num [1:13081] 736092 818159 4105086 4140849 4464314 ...
  ..$ Means  : num [1:13081] 45.183 111.038 162.785 -0.712 83.473 ...
 $ OC_AH_026C.1:'data.frame':   13081 obs. of  3 variables:
  ..$ chr    : num [1:13081] 1 1 1 1 1 1 1 1 1 1 ...
  ..$ leftPos: num [1:13081] 736092 818159 4105086 4140849 4464314 ...
  ..$ Means  : num [1:13081] 69.6 125.1 156.4 12.8 97.4 ...
 $ OC_AH_026T  :'data.frame':   13081 obs. of  3 variables:
  ..$ chr    : num [1:13081] 1 1 1 1 1 1 1 1 1 1 ...
  ..$ leftPos: num [1:13081] 736092 818159 4105086 4140849 4464314 ...
  ..$ Means  : num [1:13081] 13 12.5 103.1 56.7 145.4 ...
 $ OC_AH_058T  :'data.frame':   13081 obs. of  3 variables:
  ..$ chr    : num [1:13081] 1 1 1 1 1 1 1 1 1 1 ...
  ..$ leftPos: num [1:13081] 736092 818159 4105086 4140849 4464314 ...
  ..$ Means  : num [1:13081] 87.114 118.963 184.31 -0.173 171.733 ...
 $ OC_AH_084T  :'data.frame':   13081 obs. of  3 variables:
  ..$ chr    : num [1:13081] 1 1 1 1 1 1 1 1 1 1 ...
  ..$ leftPos: num [1:13081] 736092 818159 4105086 4140849 4464314 ...
  ..$ Means  : num [1:13081] 29.111 103.142 57.476 -0.712 50.156 ...
 $ OC_AH_086T  :'data.frame':   13081 obs. of  3 variables:
  ..$ chr    : num [1:13081] 1 1 1 1 1 1 1 1 1 1 ...
  ..$ leftPos: num [1:13081] 736092 818159 4105086 4140849 4464314 ...
  ..$ Means  : num [1:13081] 49.8 81 111.5 47 98.8 ...
 $ OC_AH_088T  :'data.frame':   13081 obs. of  3 variables:
  ..$ chr    : num [1:13081] 1 1 1 1 1 1 1 1 1 1 ...
  ..$ leftPos: num [1:13081] 736092 818159 4105086 4140849 4464314 ...
  ..$ Means  : num [1:13081] 117 152 224 121 196 ...
 $ OC_AH_096T  :'data.frame':   13081 obs. of  3 variables:
  ..$ chr    : num [1:13081] 1 1 1 1 1 1 1 1 1 1 ...
  ..$ leftPos: num [1:13081] 736092 818159 4105086 4140849 4464314 ...
  ..$ Means  : num [1:13081] 49.5 102.8 93.6 15.2 103.2 ...

我正在尝试计算每个数据帧的第三列中的每一个的所有重要分数(使用dplyr将分组分成多个分区),如果它们显着升高,则归为1,显着降低-1并且不是,a每个数据帧的新列中为零。

为了进行分组,我按照以下方式完成了这项工作:

CLL <- function (col) {
col <- col %>%
  group_by(chr, binnum = (leftPos) %/% 500000) %>%
  summarise(Means = mean(Means)) %>%
  mutate(leftPos = (binnum+1) * 120000) %>%
  select(leftPos, Means)}

CML<-lapply(df_list, CLL)

我坚持然后计算每个数据帧中每个Means列的上限和下限。我认为这是因为我不知道如何引用此列,因为它位于数据帧列表中。对于非列表数据帧,我使用:

UL = median(col2, na.rm = TRUE) + alpha*IQR(col2[1], na.rm = TRUE)
LL = median(col2, na.rm = TRUE) - alpha*IQR(col2, na.rm = TRUE)

我试图引用每个数据帧的第三列,如下所示:

tre<-lapply(CML, "[[", 3)

但是当然这会提取第三列并将其放入&#39; tre&#39;而我想改变列表中的数据帧,以便第三列与维护的其他两列有关系。

所以..... a)如何引用Means列并获取每个数据帧的上限和下限 b)基于每个数据帧的Means列中的行是否>上限或

1 个答案:

答案 0 :(得分:2)

这就是你可以做的,这与@Roland的答案相似。

假设您有类似这样的数据(您展示的数据的简化版本):

df_list <- list(OC_AH_026C = data.frame(chr = 1, 
                                        leftPos= c(73, 81, 41, 44),
                                        Means = c(111, 111, 162, -0.7)),
                OC_AH_026C.1 = data.frame(chr = 1,
                                          leftPos = c(73, 81, 41, 44),
                                          Means = c(69, 125, 156, 12)))

您可以使用lapply来&#34;循环&#34;通过这样的列表元素,计算输入的UL和LL(默认为&#34; leftPos&#34;),另外,它计算二进制列(res),指示{ {1}} - 值超出置信区间:

Means

(我希望我的问题能得到你所需要的,否则请告诉我,我会更正答案)。

data.table way

为了完整起见,我采用了df_list2 <- lapply(df_list, function(df, alpha, col2) { # perform all your calculations here df$LL <- median(df[, col2], na.rm = T) - alpha*IQR(df[, col2], na.rm = T) df$UL <- median(df[, col2], na.rm = T) + alpha*IQR(df[, col2], na.rm = T) # -1 if Means < LL, # 1 if Means > UL # 0 otherwise, nest the operators # if you wish to calculate more complex conditions df$res <- 0 + ((df$Means < df$LL)*(-1)) + ((df$Means > df$UL)*1) return(df) }, alpha = 0.95, col2 = "Means") df_list2 # $OC_AH_026C # chr leftPos Means LL UL res # 1 1 73 111.0 72.35875 149.6412 0 # 2 1 81 111.0 72.35875 149.6412 0 # 3 1 41 162.0 72.35875 149.6412 1 # 4 1 44 -0.7 72.35875 149.6412 -1 # # $OC_AH_026C.1 # chr leftPos Means LL UL res # 1 1 73 69 22.9 171.1 0 # 2 1 81 125 22.9 171.1 0 # 3 1 41 156 22.9 171.1 0 # 4 1 44 12 22.9 171.1 -1 - 方式,这种方式更快(但摆脱了列表结构)。方法如下:

data.table