在 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))
我有一个这样的数据框:
> 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))