我有一个包含30个细菌(列)和他们所拥有的基因(行)的数据框架。如果细菌缺乏该基因,数据帧中的值为,而当细菌有该基因时,值为1。
我想知道哪些基因是常见的,但在30种细菌和很少被发现的基因之间仍然存在差异。
cleansymbols3是我的数据框架,我想创建一个新的数据框架,commonsymbols只包含在至少20个细菌中发现的基因,而不是所有细菌。
下面这一行选择了在20种或更多细菌中常见的基因,但是如何设置范围20:29呢?
commonsymbols <- cleansymbols3[rowSums(cleansymbols3) >= 20, ]我试过这条线
commonsymbols <- cleansymbols3[ which( rowSums(cleansymbols3) >= 20 | rowSums(cleansymbols3) <= 29 ), ]但是它选择了所有的基因,可能是因为它首先寻找rowSums > 20,然后寻找rowSums < 29,它们一起是行。
发布于 2022-10-26 10:51:15
使用&而不是|
commonsymbols <-
cleansymbols3[rowSums(cleansymbols3) >= 20 & rowSums(cleansymbols3) <= 29, ]|是OR,但&是和。因此,您编写的代码正在查找行和大于20或小于30的行。字面上说,每一个数字都符合这些标准!
使用&只查找行和大于20、和小于30的行。也就是说,它介于这两个值之间。
PS我删除了which()
您不需要在这个上下文中使用它,因为x[c(2,4,5)]等同于x[c(FALSE, TRUE, FALSE, TRUE, TRUE)]
发布于 2022-10-26 10:58:49
使用dplyr的替代答案
您也可以使用dplry包来完成这个任务:
require(dplyr)
commonsymbols <-
rowwise(cleansymbols3) |>
mutate(total = sum(c_across())) |>
filter(total > 20, total < 30) |>
select(-total)https://stackoverflow.com/questions/74205801
复制相似问题