我有一个看起来像这样的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
我已经使用以下内容来获得我想要的东西,但我觉得我让它变得比它需要的更复杂。使用melt
和split
几乎可以获得我想要的内容,但我还需要采取一些步骤,然后将索引转换回值。这是丑陋的解决方案:
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))
感谢任何帮助。感觉就像我忽略了一些简单的东西。
答案 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