Return R 中 A 列每个级别的 B 列内的 "sub-levels"
Return the "sub-levels" within column B for each level of column A in R
我有一个如下所示的数据集:
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"))
我想循环 "fruit" 和 return 每个水果的 "status" 水平。也就是,弄出这样的东西:
$apple
[1] ripe rotten
$banana
[2] ripe rotten
$pear
[3] ripe rotten
不一定是列表;我只需要知道每个 "fruit" 级别中的级别。我的数据比示例更复杂,所以假设我不能只删除 "number" 列
我正在尝试使用应用函数或 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) split 如果知道每个级别的子级别已经是唯一的,那么这个基本的 R 解决方案就足够了,并给出相同的结果。
with(DF, split(as.character(status), fruit))
3) table 另一种可能有用的输出形式是 table 显示每个级别中每个子级别的出现次数。同样,这仅使用基数 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)
你可以试试:
split(as.character(df$status), df$fruit)
$apple
[1] "ripe" "ripe"
$banana
[1] "ripe" "ripe"
$pear
[1] "ripe" "ripe"
或者如果您只想保留唯一值:
lapply(split(as.character(df$status), df$fruit), unique)
或者如果您只想查看每个水果的价值,那么您可以尝试这种dplyr
可能性:
df %>%
group_by(fruit) %>%
summarize(type = paste(status, collapse = ", "))
fruit type
<fct> <chr>
1 apple ripe, rotten
2 banana ripe, rotten
3 pear ripe, rotten
或相同但仅考虑唯一值:
df %>%
group_by(fruit) %>%
summarize(type = paste(unique(status), collapse = ", "))
我有一个如下所示的数据集:
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"))
我想循环 "fruit" 和 return 每个水果的 "status" 水平。也就是,弄出这样的东西:
$apple
[1] ripe rotten
$banana
[2] ripe rotten
$pear
[3] ripe rotten
不一定是列表;我只需要知道每个 "fruit" 级别中的级别。我的数据比示例更复杂,所以假设我不能只删除 "number" 列
我正在尝试使用应用函数或 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) split 如果知道每个级别的子级别已经是唯一的,那么这个基本的 R 解决方案就足够了,并给出相同的结果。
with(DF, split(as.character(status), fruit))
3) table 另一种可能有用的输出形式是 table 显示每个级别中每个子级别的出现次数。同样,这仅使用基数 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)
你可以试试:
split(as.character(df$status), df$fruit)
$apple
[1] "ripe" "ripe"
$banana
[1] "ripe" "ripe"
$pear
[1] "ripe" "ripe"
或者如果您只想保留唯一值:
lapply(split(as.character(df$status), df$fruit), unique)
或者如果您只想查看每个水果的价值,那么您可以尝试这种dplyr
可能性:
df %>%
group_by(fruit) %>%
summarize(type = paste(status, collapse = ", "))
fruit type
<fct> <chr>
1 apple ripe, rotten
2 banana ripe, rotten
3 pear ripe, rotten
或相同但仅考虑唯一值:
df %>%
group_by(fruit) %>%
summarize(type = paste(unique(status), collapse = ", "))