r - 在 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 的任务可能会有一个整洁的解决方案。
解决方案
我们可以重塑为“长”格式和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))
推荐阅读
- php - 已弃用:必需参数 $to_addr 遵循可选参数
- java - 杰克逊序列化重复字段与@JsonAnyGetter
- python - 如何将 OGG_OPUS 输入音频流转换为 Google Speech-to-Text API 可接受的字节流格式?
- reactjs - 我怎样才能在同一个项目中拥有下一个 js 和 react 应用程序?
- c++ - Clang MatchResult 没有绑定 AST 节点?
- linux - 在期望脚本中通过 ssh/telnet(甚至是 shell)传输二进制数据时出错
- html - 如何调整搜索栏占位符文本的位置
- vue.js - import Vue from 'vue' 报错了
- java - 为什么 Selenium 的 ExpectedConditions.elementToBeClickable(By.xpath(xPath))) 返回一个字符串?
- c# - 添加文本框值,保持高值