在R中应用sapply时如何保持数据帧格式?

问题描述 投票:0回答:1

我编写了一个函数,将我的数据帧分成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 dataframe dplyr plyr
1个回答
1
投票

这里是完整的基本R版本,我们使用lapplyrowSums将行转到NA

© www.soinside.com 2019 - 2024. All rights reserved.