【发布时间】:2017-03-25 03:29:20
【问题描述】:
假设我有一个如下所示的数据框:
A1 A2 A3 B1 B2 B3 C1 C2 C3
X 00 10 00 10 00 11 00 00 00
Y 00 00 00 20 00 00 00 00 00
Z 00 00 00 29 30 00 50 42 38
首先,我想评估哪些样本 (A, B, C) 有多个不同于零的列。例如,对于 X,A 为假,B 为真,C 为假。
然后,我想保留至少有一个样本 (A, B or C) 为早期代码返回 TRUE 的行。这意味着我的新数据框将只有 X 行(样本 B 为真)和 Z 行(样本 B 和 C 为真)。
如果可能的话,这可以单独或在一行代码中完成。只要最终结果相同(排除 Y 之类的行)
【问题讨论】:
-
这些值是数字还是文本?数字通常不显示双零。
-
它们是数字。仅在实际数据帧中一个零。这里的双零与强迫症有关。
-
为了保留你所拥有的,
df[colSums(aggregate(t(df), list(substr(names(df), 1, 1)), function(x){sum(x != '00') > 1})[-1]) > 0, ]。要迁移到更整洁的数据结构,library(tidyverse); df %>% rownames_to_column('var') %>% gather(sample, value, -var) %>% separate(sample, c('sample', 'obs'), 1) %>% group_by(var, sample) %>% filter(sum(value != '00') > 1)