Я не совсем уверен, хотите ли вы сохранить строки или столбцы с суммой записей> 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)