首页 > 解决方案 > 在 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 的任务可能会有一个整洁的解决方案。

标签: rdplyrpurrr

解决方案


我们可以重塑为“长”格式和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))

推荐阅读