如何解决R:如何删除数据框所有列中的dydyverse组内的单例?
我正在处理大量的ASV检测数据集,其中每个样品名称都有来自不同PCR运行的三个重复。我的目标是从数据集中删除单例。这意味着,如果样本名称在所有三个复制中仅检测到一个ASV,我希望将1转换为零。
到目前为止,我已经能够使用3个ASV进行小规模的操作,但是我的方法要求我写出每个ASV名称。这对我不起作用,因为我的数据集有9000个ASV。我需要一种更好的方法来删除单例。
这是我到目前为止所做的:
#make dataframe
sample.name <- c("a","a","b","c","c")
data <- as.data.frame(sample.name)
data$sample.pcr <- c("1","2","3","1","3")
data$AVS1 <- c(3,1,1)
data$AVS2 <- c(0,2,3,0)
data$AVS3 <- c(0,5,0)
#mutate so that if the sum of a sample.name group is 1 for an ASV then make that sum 0
data %>%
group_by(sample.name) %>%
mutate(AVS1 = case_when(sum(AVS1)==1 ~ 0,T ~ AVS1),AVS2 = case_when(sum(AVS2)==1 ~ 0,T ~ AVS2),AVS2 = case_when(sum(AVS3)==1 ~ 0,T ~ AVS3))
更新:
这是@akrun提供的解决方案。
library(dplyr)
data %>%
group_by(sample.name) %>%
mutate(across(starts_with('AVS'),~ case_when(sum(.) == 1 ~ 0,TRUE ~ .)))
他们建议将case_when
修改为~ case_when(sum(.) == 1 ~ 0L,TRUE ~ .)))
。
通过修改并通过更改starts_with()
中的“ AVS”->“ ASV”,我可以从数据集中删除单例。
这是我用来测试数据集中是否存在单例的方法:
# look and see if there are singletons
#we do this by summing occurrences of ASV in PCR reps per sample
#if there is a singleton,the sum of occurrences for an ASV in a sample will be equal to one
t <- data%>% group_by(sample.name) %>% #make group
select(-sample.pcr) %>% #remove column
dplyr::summarise(across(.fns=sum)) # sum an ASV's occurrence for a sample,do this across the whole dataset
sum(t==1) #check how many sums were equal to one - if this is greater than 0 then we need to remove singletons
解决方法
我们可以使用across
将函数应用于多列
library(dplyr)
data %>%
group_by(sample.name) %>%
mutate(across(starts_with('AVS'),~ case_when(sum(.) == 1 ~ 0,TRUE ~ .)))
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。