r - 通过列循环过滤以返回包含所有列的列表,每个列包含符合过滤条件的相应行名

标签 r

我有一个名为“df”的数据框,由 181 列和 22,819 行组成,所有数据均为二进制形式(即 0、1)。对于数据框的每一列,此处的对象涉及选择值为“1”的那些行并将其存储到列表中。最后,我希望得到一个包含所有“df”列的列表,每个列都包含给定列的值为“1”的行名。我知道有几种方法可以解决这个问题,但是由于我对 for 循环和 apply 函数族的经验还为时过早,我想请求一些可以实际执行上述任务的代码行。

这是数据的摘录:

View(df)

GeneSym ARID3A ATF1 ATF2 ATF3 BACH1 BATF  .  .  .
A1BG       1    0    1    0     0    0     
A1CF       1    0    1    1     1    1     
A2M        0    1    0    0     1    1      
AA06       0    1    1    0     0    1     
AAA1       0    1    0    0     0    1   
.
.
.  

我想获得以下数据框/矩阵(无论适用):

TransFac  1       2       3       4     .   .   .
ARID3A    A1BG    A1CF 
ATF1      A2M     AA06    AAA1
ATF2      A1BG    A1CF    AA06
ATF3      A1CF
BACH1     A1CF    A2M     
BATF      A1CF    A2M     AA06    AAA1
.
.
.

很抱歉没有提供我的几次尝试来解决这个问题,他们太尴尬了,无法分享。我使用“any_vars”和“all_vars”参数尝试了 filter_all 函数,但生成的数据帧要么包含所有未过滤的数据(在“any_vars”的情况下),要么根本不包含任何数据(在“all_vars”的情况下)。

最佳答案

这是一 strip 你到达那里的单线:

lapply(df[, -1], function(x) df$GeneSym[x == 1])

# $ARID3A
# [1] "A1BG" "A1CF"
# 
# $ATF1
# [1] "A2M"  "AA06" "AAA1"
# 
# $ATF2
# [1] "A1BG" "A1CF" "AA06"
# 
# $ATF3
# [1] "A1CF"
# 
# $BACH1
# [1] "A1CF" "A2M" 
# 
# $BATF
# [1] "A1CF" "A2M"  "AA06" "AAA1"

粗略地翻译为:对于除第一列以外的所有列,找到 GeneSym 的值,其中该行等于 1。

如果您想要data.frametibble 结果,您可能需要考虑tidyverse:

library(tidyverse)
lapply(df[, -1], function(x) df$GeneSym[x == 1]) %>%
    enframe() %>%
    unnest() %>%
    group_by(name) %>%
    mutate(i = row_number()) %>%
    spread(i, value)

# # A tibble: 6 x 5
# # Groups:   name [6]
#   name   `1`   `2`   `3`   `4`  
#   <chr>  <chr> <chr> <chr> <chr>
# 1 ARID3A A1BG  A1CF  NA    NA   
# 2 ATF1   A2M   AA06  AAA1  NA   
# 3 ATF2   A1BG  A1CF  AA06  NA   
# 4 ATF3   A1CF  NA    NA    NA   
# 5 BACH1  A1CF  A2M   NA    NA   
# 6 BATF   A1CF  A2M   AA06  AAA1 

关于r - 通过列循环过滤以返回包含所有列的列表,每个列包含符合过滤条件的相应行名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57791252/

相关文章:

r - 矢量化 Rcpp 随机二项式绘制

r - 将函数与 group-by 一起应用于 data.table 的所有列

r - 数据表 DT[i, j, by] 不使用 i 中的条件选择组,试图过滤组内唯一值的数量

r - 如何创建一个小于前一列值的新列

r - ggplot2 饼图和圆环图在同一图上

R 用名称替换 id 值

r - 按组对前 500 行进行子集,用于组的子集

无边界 R 序列生成

r - 阻止dplyr加入NA

R 中数据帧中固定行数的重复值