我编写了一个函数,将我的数据帧分成3列的序列(每个列代表样本重复项),然后在这些重复项上应用另一个函数。如果在此重复序列中三个样本中至少有两个样本没有超过某个特定阈值(在这种情况下为16),则后者将所有值替换为“ NA”。
这是示例代码:
# Install and load packages if (!require(plyr)) install.packages('plyr') library(plyr) if (!require(dplyr)) install.packages('dplyr') library(dplyr) # Create example data frame df <- data.frame (ID = c('data1', 'data2', 'data3'), sample1 = c(2, 18, 3), sample2 = c(4, 17, 16), sample3 = c(3, 11, 2), sample4 = c(22, 11, 35), sample5 = c(10, 8, 22), sample6 = c(17, 9, 11)) # Function for threshold settings setThreshold <- function(df) { thresholded_replicates <- data.frame( sapply(split.default(df[2:ncol(df)], rep(seq_along(df), each = 3, length.out = ncol(df)-1) ), function(df) { df <- df %>% mutate(rowsum = apply(df, 1, function(x) sum(x > 16))) %>% mutate_at(1:ncol(df), funs(ifelse(rowsum < 2, NA, .))) %>% select(-rowsum) return(df) } )) return(thresholded_replicates) } df_th <- setThreshold(df)
输入数据框看起来像这样:
> df ID sample1 sample2 sample3 sample4 sample5 sample6 1 data1 2 4 3 22 10 17 2 data2 18 17 11 11 8 9 3 data3 3 16 2 35 22 11
应用该功能后,在数据框下方:
> df_th X1 X2 sample1 NA, 18, NA 22, NA, 35 sample2 NA, 17, NA 10, NA, 22 sample3 NA, 11, NA 17, NA, 11
该函数运行良好,它将复制行中的所有值替换为不包含至少两个大于16的值的“ NA”。但是,数据帧的格式混合在一起,结果数据帧应看起来像这样:
sample1 sample2 sample3 sample4 sample5 sample6 1 NA NA NA 22 10 17 2 18 17 11 NA NA NA 3 NA NA NA 35 22 11
如何实现?
我编写了一个函数,将我的数据帧分成3列的序列(每个列代表样本重复项),然后在这些重复项上应用另一个函数。后者将所有值替换为“ ...
这里是完整的基本R版本,我们使用lapply
和rowSums
将行转到NA
。