【问题标题】:R - Excluding rows with a specific amount of zeroes in different sets of columns from the same data frameR - 排除来自同一数据帧的不同列集中具有特定数量零的行
【发布时间】: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)

标签: r dataframe


【解决方案1】:

这将对所有以相似字母开头并以数字结尾的列进行分组。

# data set used
df1 <- data.frame(A1=rep(0,3), A2=c(10,0,0), A3=rep(0,3), B1=c(10,20,29), B2=c(0,0,30), B3=c(11,0,0), C1=c(0,0,50), C2=c(0,0,42), C3=c(0,0,38))
rownames(df1) <- c("X", "Y", "Z")

# define column groups and count values greater than zero
col.samp <- unique(gsub("[0-9]", "", colnames(df1)))
m1 <- sapply(col.samp, function(x) rowSums(df1[grep(paste0("^", x), colnames(df1))] > 0))

df1[rowSums(m1 > 0) > 1, ]

  A1 A2 A3 B1 B2 B3 C1 C2 C3
X  0 10  0 10  0 11  0  0  0
Z  0  0  0 29 30  0 50 42 38

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多