r - 根据总和选择列
问题描述
例如,我有一个包含许多基因列和行的数据框
id treatment time gene1 gene2 gene3 …
1 A 1 2 0 2 …
2 A 2 0 0 3 …
3 A 3 0 0 4 …
4 B 4 0 0 0 …
5 B 5 0 0 2 …
6 B 3 1 0 1 …
7 C 5 0 0 2 …
我想保留所有前几列(示例数据为三,但实际数据中有很多列)和列总和> 0的基因列。
对于我的问题,我将不胜感激。非常感谢!
解决方案
我不完全确定是否要保留条目总和 > 0 的行或列。
如果是前者,您可以rowSums
像这样使用
df[rowSums(df[, grep("gene", names(df))]) > 0, ]
#id treatment time gene1 gene2 gene3
#1 1 A 1 2 0 2
#2 2 A 2 0 0 3
#3 3 A 3 0 0 4
#5 5 B 5 0 0 2
#6 6 B 3 1 0 1
#7 7 C 5 0 0 2
或者只保留条目总和 > 0 的列,您可以使用colSums
df[, names(df) %in% c(
names(df)[grep("gene", names(df), invert = T)],
names(which(colSums(df[, grep("gene", names(df))]) > 0)))]
# id treatment time gene1 gene3
#1 1 A 1 2 2
#2 2 A 2 0 3
#3 3 A 3 0 4
#4 4 B 4 0 0
#5 5 B 5 0 2
#6 6 B 3 1 1
#7 7 C 5 0 2
这假设所有基因列都包含单词"gene"
(并且所有非基因列都不包含单词"gene"
)。
或者更简洁(感谢@Shree),
df[, c(rep(T, 3), colSums(df[, -c(1:3)]) > 0)]
假设前 3 列是非基因列(其余列都是基因列)。
样本数据
df <- read.table(text =
"id treatment time gene1 gene2 gene3
1 A 1 2 0 2
2 A 2 0 0 3
3 A 3 0 0 4
4 B 4 0 0 0
5 B 5 0 0 2
6 B 3 1 0 1
7 C 5 0 0 2", header = T)
推荐阅读
- phoenix-framework - Why does the generated form's validation check the changeset's `:action` field instead of `:valid?`?
- html - 如何使用 HTML 和 CSS 将卡片和表单彼此相邻放置?
- python - 列表中给定元素的最后 6 个元素的平均值
- vba - 将宏分配给与自动生成的按钮行对应的单元格
- android - 如何从 string.xml 中的字符串数组将子项添加到 ExpandableListView?
- javascript - 有问题在角度 6 中设置图像缓存
- python - 在 Python 中将 doc 转换为 docx
- android - 如何使用 Url 中的查询参数在改造 2 中获取数据?
- c# - 如何拆分 CSV 文件
- angular - angular 2 4 5 - 如何在 component.ts 中定义对象变量