gpt4 book ai didi

R:在 data.frame 列中拆分不平衡列表

转载 作者:行者123 更新时间:2023-12-03 18:24:20 26 4
gpt4 key购买 nike

假设您有一个具有以下结构的数据框:

df <- data.frame(a=c(1,2,3,4), b=c("job1;job2", "job1a", "job4;job5;job6", "job9;job10;job11"))

所在栏目 b是一个以分号分隔的列表(按行不平衡)。理想的 data.frame 是:
id,job,jobNum
1,job1,1
1,job2,2
...
3,job6,3
4,job9,1
4,job10,2
4,job11,3

我有一个需要近 2 小时(170K 行)的部分解决方案:
# Split the column by the semicolon.  Results in a list.
df$allJobs <- strsplit(df$b, ";", fixed=TRUE)

# Function to reshape column that is a list as a data.frame
simpleStack <- function(data){
start <- as.data.frame.list(data)
names(start) <-c("id", "job")
return(start)
}
# pylr!
system.time(df2 <- ddply(df, .(id), simpleStack))

这似乎是一个大小问题,因为如果我运行
system.time(df2 <- ddply(df[1:4000,c("id", "allJobs")], .(id), simpleStack))

只需9秒。首先使用 sapply(具有不同的功能)转换为一组 data.frames 很快,但所需的 `rbind' 需要更长的时间。

最佳答案

#Split by ; as before
allJobs <- strsplit(df$b, ";", fixed=TRUE)

#Replicate a by the number of jobs in each case
n <- sapply(allJobs, length)
id <- rep(df$a, times = n)

#Turn allJobs into a vector
job <- unlist(allJobs)

#Retrieve position of each job
jobNum <- unlist(lapply(n, seq_len))

#Combine into a data frame
df2 <- data.frame(id = id, job = job, jobNum = jobNum)

关于R:在 data.frame 列中拆分不平衡列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4724938/

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