更容易从字符向量列表中反转数据?

时间:2016-06-20 19:42:42

标签: r

我有一个看起来像这样的data.frame:

  states       responsible
1     KS        Joe, Suzie
2     MO               Bob
3     CO Suzie, Bob, Ralph
4     NE               Joe
5     MT      Suzie, Ralph

每个州都有一份在另一栏中负责的人员名单。我想反过来创建一个每个人负责的所有状态的列表。 以下是创建可重现示例的方法:

states <- c("KS", "MO", "CO", "NE", "MT")
responsible <- list(c("Joe", "Suzie"), "Bob", c("Suzie", "Bob", "Ralph"), "Joe", c("Suzie", "Ralph"))    
df <- as.data.frame(cbind(states, responsible))

以下是我希望数据显示的方式:

  person       states
1     Joe           KS, NE
2     Suzie     KS, CO, MT
3     Bob           MO, CO
4     Ralph         CO, MT

我已经使用以下内容来获得我想要的东西,但我觉得我让它变得比它需要的更复杂。使用meltsplit几乎可以获得我想要的内容,但我还需要采取一些步骤,然后将索引转换回值。这是丑陋的解决方案:

people <- unique(unlist(df$responsible))

foo <- melt(responsible)

bar <- split(foo$L1, foo$value)

#This function just grabs the indices from 'bar' and gets the corresponding states. 
#Really ugly and I'm guessing unnecessary.
stackoverflow_function <- function(person) {
  return(states[do.call('$', list(bar, paste0(person)))])
}

answer <- lapply(people, stackoverflow_function)

as.data.frame(cbind(people, answer))

感谢任何帮助。感觉就像我忽略了一些简单的东西。

1 个答案:

答案 0 :(得分:1)

您可以使用data.table

data.table::setDT(df)
df[, .(responsible = unlist(responsible)), .(states = unlist(states))]
  [, .(states = list(states)), .(responsible)]

   responsible   states
1:         Joe    KS,NE
2:       Suzie KS,CO,MT
3:         Bob    MO,CO
4:       Ralph    CO,MT