我有一个名为“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.frame
或tibble
结果,您可能需要考虑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/