考虑 R 中数据框中的条件提取行

时间:2021-07-26 12:49:05

标签: r dataframe dplyr

如果所有列都为零,我想提取行。在 df 的第一列中,有一个基因 ID 列表,在第二列中每个个体重复。如果下一列中所有个体的 df[,3:length(df)] 都为零,我想提取基因 ID。

> dim(df)
[1] 1040675      56

> df
ID     INDV     tra1   tr2   tr3  tra2   tr15   tr1b  
ENS777   1       1.2    0     0   1.6    3.3    0
ENS777   2       1.2    0     0   1.6    3.3    0
ENS777   3       1.2    0     0   1.6    3.3    0
ENS777   4       1.2    0     0   1.6    3.3    0
ENS999   1        0     0     0    0      0     0
ENS999   2        0     0     0    0      0     0
ENS999   3        0     0     0    0      0     0
ENS999   4        0     0     0    0      0     0
ENS888   1       1.2    0     0   1.6    3.3    0
ENS888   2       1.2    0     0   1.6    3.3    0
ENS888   3       1.2    0     0   1.6    3.3    0
ENS888   4       1.2    0     0   1.6    3.3    0

因此,在这种情况下,输出将是 ENS999

2 个答案:

答案 0 :(得分:1)

如果我理解正确,如果所有个人的所有列都为零。

你可以试试这个:

library(data.table)

df <- fread("Book2.csv")
> df
        ID INDV tra1 tr2 tr3 tra2 tr15 tr1b colsum
 1: ENS777    1  1.2   0   0  1.6  3.3    0    6.1
 2: ENS777    2  1.2   0   0  1.6  3.3    0    6.1
 3: ENS777    3  1.2   0   0  1.6  3.3    0    6.1
 4: ENS777    4  1.2   0   0  1.6  3.3    0    6.1
 5: ENS999    1  0.0   0   0  0.0  0.0    0    0.0
 6: ENS999    2  0.0   0   0  0.0  0.0    0    0.0
 7: ENS999    3  0.0   0   0  0.0  0.0    0    0.0
 8: ENS999    4  0.0   0   0  0.0  0.0    0    0.0
 9: ENS888    1  1.2   0   0  1.6  3.3    0    6.1
10: ENS888    2  1.2   0   0  1.6  3.3    0    6.1
11: ENS888    3  1.2   0   0  1.6  3.3    0    6.1
12: ENS888    4  1.2   0   0  1.6  3.3    0    6.1

#take the column sums
df[, colsum := tra1+tr2+tr3+tra2+tr15+tr1b]

#take the row sums by ID
df[, rowsum := sum(colsum), by= ID]

> df
        ID INDV tra1 tr2 tr3 tra2 tr15 tr1b colsum rowsum
 1: ENS777    1  1.2   0   0  1.6  3.3    0    6.1   24.4
 2: ENS777    2  1.2   0   0  1.6  3.3    0    6.1   24.4
 3: ENS777    3  1.2   0   0  1.6  3.3    0    6.1   24.4
 4: ENS777    4  1.2   0   0  1.6  3.3    0    6.1   24.4
 5: ENS999    1  0.0   0   0  0.0  0.0    0    0.0    0.0
 6: ENS999    2  0.0   0   0  0.0  0.0    0    0.0    0.0
 7: ENS999    3  0.0   0   0  0.0  0.0    0    0.0    0.0
 8: ENS999    4  0.0   0   0  0.0  0.0    0    0.0    0.0
 9: ENS888    1  1.2   0   0  1.6  3.3    0    6.1   24.4
10: ENS888    2  1.2   0   0  1.6  3.3    0    6.1   24.4
11: ENS888    3  1.2   0   0  1.6  3.3    0    6.1   24.4
12: ENS888    4  1.2   0   0  1.6  3.3    0    6.1   24.4

# Now you need the unique IDs for which the row sums are zero 
> unique(df[rowsum==0]$ID)
[1] "ENS999"


答案 1 :(得分:0)

使用 dplyr -

library(dplyr)

df %>%
  group_by(ID) %>%
  filter(all(unlist(dplyr::select(cur_data(), tra1:tr1b) == 0))) %>%
  ungroup %>%
  distinct(ID)

#   ID    
#  <chr> 
#1 ENS999