微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在列上应用函数,而结果不会根据函数的结果替换列值

如何解决在列上应用函数,而结果不会根据函数的结果替换列值

(这基本上是图片中的数据帧)

structure(list(mz = c(40,50,60,70,80,90),`sample in1` = c(10,51,125,99,675,12),`sample in2` = c(9,105,2424,5),`Sample in3` = c(1,300,1241,0.02),`blank 1` = c(5,20,68,0),`blank 2` = c(10,77,`blank 3` = c(15,89,0.01)),row.names = c(NA,-6L),class = c("tbl_df","tbl","data.frame"))

我有一个超过50列和50.000行的大型数据框,但这是我所拥有的简化版本。

enter image description here

我基本上需要做的是将“空白”列汇总为1列。我已经在所有空白列上使用RowMeans做到了这一点。 接下来,我想对数据框中的每个样本值应用一个函数,该函数是:该特定行的所有空白列的样本值/平均值= Ratio SB。 棘手的部分是:我不希望此函数的结果替换样本的列值。 我要执行的操作是(1)保持列值不变,如果IF Ratio SB大于设置的限制(例如:Ratio SB> 2.5,应保持列值不变)。如果SB比率的结果小于设置的限制,则OR(2)返回0(或NA)(例如:如果比率SB

这些是我的代码的3个基本要素。 输出仍然应该是一个数据帧,并且将其应用于图1所示的数据帧时,在运行我要执行的功能时,应该在数据帧中进行以下更改。

enter image description here

这是应用代码后的样子:

structure(list(mz = c(40,`sample in1` = c(NA,NA,`sample in2` = c(NA,`Sample in3` = c(NA,NA),`Blank Average` = c(10,78,0.00333333),"data.frame"))

到目前为止,我一直尝试使用case_when,但是为此,我需要恢复为列表结构,并且显然无法将其应用于数据框。 我也尝试过:Ratio_X

我很抱歉,如果有任何不清楚的地方,我是R语言中的完整初学者,并且堆栈溢出。如果您需要其他信息,请告诉我。预先感谢!

解决方法

这是基本的R方法:

#Get all the columns which has 'blank' in it
blank_cols <- grep('blank',names(df))
#Get all the columns which has 'sample' in it. 
#Using `ignore.case` because you have "Sample" in 3rd column
sample_cols <- grep('sample',names(df),ignore.case = TRUE)
#Threshold limit to check for
thresh <- 2.5

#Get mean of blank_cols
df$Blank_avg <- rowMeans(df[,blank_cols],na.rm = TRUE)
#Compare sample_cols with the mean,replace them by NA if they are below thresh
df[sample_cols][sweep(df[sample_cols],1,df1$Blank_avg,`/`) <= thresh] <- NA
#Turn Blank_avg to NA where Blank_avg = 0
df$Blank_avg[df$Blank_avg == 0] <- NA
#Remove blank_cols
result <- df[,-blank_cols]
result
# A tibble: 6 x 5
#     mz `sample in1` `sample in2` `Sample in3` Blank_avg
#  <dbl>        <dbl>        <dbl>        <dbl>     <dbl>
#1    40           NA           NA        NA     10      
#2    50           51           51        51     20      
#3    60           NA           NA        NA     50      
#4    70           NA           NA       300     78      
#5    80          675         2424      1241     NA      
#6    90           12            5       0.02   0.00333

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。