r - 为 R 中 A 列的每个级别返回 B 列中的“子级别”
问题描述
我有一个如下所示的数据集:
number fruit status
1 1 apple ripe
2 2 apple rotten
3 3 banana ripe
4 4 banana rotten
5 5 pear ripe
6 6 pear rotten
7 7 apple ripe
data.frame(number = 1:7,
fruit = c(rep(c("apple","banana","pear"), each = 2),"apple"),
status =c(rep(c("ripe", "rotten"),3),"ripe"))
我想遍历“水果”并返回每个水果的“状态”级别。也就是说,得到这样的东西:
$apple
[1] ripe rotten
$banana
[2] ripe rotten
$pear
[3] ripe rotten
它不必是一个列表;我只需要知道每个“水果”级别中的级别。我的数据比示例更复杂,所以假设我不能只删除“数字”列
我正在尝试使用应用函数或 dplyr,但我不知道如何获得它。
解决方案
1) tapply/unique假设只需要唯一的值,status
可以使用这个基本的 R 解决方案:
with(DF, tapply(as.character(status), fruit, unique, simplify = FALSE))
给予:
$apple
[1] "ripe" "rotten"
$banana
[1] "ripe" "rotten"
$pear
[1] "ripe" "rotten"
2) 拆分如果知道每个级别的子级别已经是唯一的,那么这个基本 R 解决方案就足够了,并且给出了相同的结果。
with(DF, split(as.character(status), fruit))
3) 表格另一种可能有用的输出形式是表格,显示每个级别中每个子级别的出现次数。同样,这仅使用基数 R。
m <- table(DF[-1])
m
给予:
status
fruit ripe rotten
apple 1 1
banana 1 1
pear 1 1
我们可以使用 igraph 包创建一个二分图:
library(igraph)
g <- graph_from_incidence_matrix(m)
plot(g, layout = layout_as_bipartite)
推荐阅读
- amazon-web-services - 从 AMI 创建的 EC2 反映原始实例中未更改的私有 IP
- php - 如何跟踪 laravel 作业(队列)中已发送或待处理的邮件?
- dialogflow-es - 将 zapier 与 kommunicate 集成
- c# - C# Linq Group by 与字典
- excel - 当同一行中的单元格更改时需要帮助更改单元格值
- c - 在 C 中初始化 Peg Solitaire Board
- sql - SQL左连接最新记录
- webrtc - 服务器是否可以“收听”音频或视频流?
- python - 写入新文件时,Python无法在行尾后追加换行符?
- sql - 在 Postgresql 上创建索引