为R中A列的每个级别返回B列中的“子级别”

时间:2019-03-07 17:46:34

标签: r for-loop dplyr apply spread

我有一个看起来像这样的数据集:

  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

它不一定是列表;我只需要了解每个“水果”级别中的级别。我的数据比示例要复杂,所以假设我不能只删除“数字”列

我正在尝试使用Apply函数或dplyr,但我不知道如何获得此信息。

2 个答案:

答案 0 :(得分:3)

1)轻敲/唯一假设只需要使用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)

screenshot

答案 1 :(得分:2)

您可以尝试:

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 = ", "))