Вернуть «подуровни» в столбце B для каждого уровня столбца A в R - PullRequest
1 голос
/ 07 марта 2019

У меня есть набор данных, который выглядит следующим образом:

  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 ]

3 голосов
/ 07 марта 2019

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) таблица Другой формой вывода, которая может быть полезна, является таблица, показывающая число вхождений каждого подуровня в каждом уровне. Опять же, здесь используется только база 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

2 голосов
/ 07 марта 2019

Вы можете попробовать:

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 = ", "))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...