在 R/dplyr 中按条件将数据框转换为列表

Transform dataframe into list by condition in R/dplyr

我有一个这样的数据框:

> df
Person    a    b    c    d
John      1    0    1    1
James     0    1    1    0
Keith     1    0    0    0
Boris     0    1    0    0
...

我需要将它转换成一个向量列表,其中元素的名称对应于数据框的列名,列表的元素是列中有 1 的人的名字。对于上面的例子,列表应该是这样的:

> result_list
$a
[1] "John" "Keith"

$b
[1] "James" "Boris"

$c
[1] "John" "James"

$d
[1] "John"

继续我所知道的,每列的“切换”名称向量可以这样获得:

df$Person[which(df$a == 1)]

但我不确定如何正确地对其进行迭代,我认为对于利用 dplyr 和 purrr 的任务可能有一个简洁的解决方案。

我们可以重塑为 'long' 格式和 split

library(dplyr)
library(tidyr)
df %>% 
    pivot_longer(cols = -Person) %>% 
    filter(value == 1) %>% 
    {split(.$Person, .$name)}

-输出

$a
[1] "John"  "Keith"

$b
[1] "James" "Boris"

$c
[1] "John"  "James"

$d
[1] "John"

数据

df <- structure(list(Person = c("John", "James", "Keith", "Boris"), 
    a = c(1L, 0L, 1L, 0L), b = c(0L, 1L, 0L, 1L), c = c(1L, 1L, 
    0L, 0L), d = c(1L, 0L, 0L, 0L)), class = "data.frame", row.names = c(NA, 
-4L))