Реорганизация фрейма данных в R по столбцам - PullRequest
1 голос
/ 07 мая 2020

Я новичок в программировании, и я действительно не знаю, что искать в Google, потому что я не могу найти подходящего имени для этой операции. Прошу прощения, если я неправильно сформулировал вопрос, я все еще не знаю правильные термины. Что касается моей проблемы: у меня есть набор данных, который структурирован следующим образом:

plant <-  c("A", "B", "C", "D")
employee <- c("Peter, Mark", "Mark", "Peter", "Steven")
df <- data.frame(plant, employee)

  plant    employee
1     A Peter, Mark
2     B        Mark
3     C       Peter
4     D      Steven

Теперь я хочу «реорганизовать» фрейм данных по сотрудникам, чтобы он выглядел так:

  employee plant
1    Peter  A, C
2     Mark  A, B
3    Maria     A
4   Steven     C

I Я действительно беспомощен, где искать направление или решение, я был бы признателен за любой намек. Возможно ли это в базе R?

Ответы [ 2 ]

1 голос
/ 07 мая 2020

Используя базу R, мы можем разделить employee на "," и повторить значения plant на его основе. Мы можем использовать tapply для объединения значений plant для каждого employee.

temp <- strsplit(df$employee, ",", fixed = TRUE)
stack(tapply(rep(df$plant, lengths(temp)), trimws(unlist(temp)), toString))


#  values    ind
#1   A, B   Mark
#2   A, C  Peter
#3      D Steven
1 голос
/ 07 мая 2020

Мы можем использовать separate_rows, чтобы разделить столбец «сотрудник», а затем сгруппировать его по «сотруднику», paste «завод»

library(dplyr)
library(tidyr)
df %>% 
  separate_rows(employee) %>%
  group_by(employee) %>% 
  summarise(plant = toString(plant))

Если нам нужно использовать base R, вариант состоит в том, чтобы разделить столбец «сотрудник» с strsplit на list из vector s, установить имена list с столбцом «завод», преобразовать именованный list в два столбца data.frame с stack и используйте aggregate для группировки paste (toString - paste(..., collapse=", "))

aggregate(ind ~ values, stack(setNames(strsplit(as.character(df$employee),
            ",\\s*"), df$plant)), toString)
...