gpt4 book ai didi

r - melt + strsplit,或与aggregate相反

转载 作者:行者123 更新时间:2023-12-02 04:46:27 27 4
gpt4 key购买 nike

我有一个小问题,在概念上似乎很简单,但我找不到解决方法...

假设我有一个 data.frame df2,其中有一列列出汽车品牌,另一列包含每个品牌的所有型号,用“,”分隔。我已经获得了 df2 聚合另一个名为 df1 的 data.frame,主键是模型。

我应该如何继续执行相反的任务(即:从 df2 到 df1)?我的猜测类似于 melt(df2, id=unlist(strsplit('models',',')))...非常感谢!

这是一个 MWE:

df1 <- data.frame(model=c('a1','a2','a3','b1','b2','c1','d1','d2','d3','d4'), 
brand=c('a','a','a','b','b','c','d','d','d','d'))
df1
collap <- function(x){
out <- paste(sort(unique(x)), collapse=",")
return (out)
}
df2 <- aggregate(df1$model, by=list(df1$brand), collap)
names(df2) <- c('brand','models')
df2 #how can I do the opposite task (ie: from df2 to df1)?

最佳答案

这里有两种选择:

使用data.tableunlist如下:

library(data.table)
DT <- data.table(df2)
DT[, list(model = unlist(strsplit(as.character(models), ","))),
by = brand]
# brand model
# 1: a a1
# 2: a a2
# 3: a a3
# 4: b b1
# 5: b b2
# 6: c c1
# 7: d d1
# 8: d d2
# 9: d d3
# 10: d d4

使用我的“splitstackshape”包中的 concat.split.multiple。这种方法的一个好处是能够使用一个简单的命令拆分多个列。

library(splitstackshape)
out <- concat.split.multiple(df2, "models", ",", "long")
out[complete.cases(out), ]
# brand time models
# 1 a 1 a1
# 2 b 1 b1
# 3 c 1 c1
# 4 d 1 d1
# 5 a 2 a2
# 6 b 2 b2
# 8 d 2 d2
# 9 a 3 a3
# 12 d 3 d3
# 16 d 4 d4

关于r - melt + strsplit,或与aggregate相反,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19711211/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com