gpt4 book ai didi

R Plyr Sapply 似乎真的很慢

转载 作者:行者123 更新时间:2023-12-04 05:40:04 25 4
gpt4 key购买 nike

我以为我有一个非常简单的数据帧转换,但出于某种原因我无法理解它似乎需要永恒,这让我怀疑它可能没有按照我的希望进行。任何人都可以解释一下吗?

第 1 部分 - 将源数据转换为单独的列(实际 df 有 260 万行)。

鉴于...

> V1 <- c("E11 2286 1", "ECAT 2286 1", "M11 2286 1", "M12 2286 1", "MCAT 2286 1", "C24 2287 1")
> df <- data.frame(V1)
> df
V1
1 E11 2286 1
2 ECAT 2286 1
3 M11 2286 1
4 M12 2286 1
5 MCAT 2286 1
6 C24 2287 1

我想创建两个新列(itemID 和主题)并用 V1 中相应行的子字符串填充每个列。

这个我可以用;

> require(stringr)
> df$itemID <- sapply(1:nrow(df), function(i) str_split(df[i,"V1"]," ")[[1]][[2]] )
> df$topic <- sapply(1:nrow(df), function(i) str_split(df[i,"V1"]," ")[[1]][[1]] )

但这需要几分钟,而且似乎应该有更有效的方法。所以首先我尝试使用 sapply;

> sapply(1:nrow(df), function(i) {
t <- str_split(df[i,"V1"]," ")
df$itemID <- t[[1]][[2]]
df$topic <- t[[1]][[1]]
})

一个多小时后,什么也没有。所以我放弃了,因为当单个命令花费不到 20 分钟时,这显然毫无进展。

下一个选项是尝试在单个任务上使用 ddply,但也失败了。

> require(plyr)
> require(stringr)
> df$itemID <- ddply(df, .(V1), str_split(df$V1," ")[[1]][[2]], .progress="text" )

Error in get(as.character(FUN), mode = "function", envir = envir) :
object '2286' of mode 'function' was not found

因此对于此任务的第一部分,任何人都可以;

  • i) 告诉我哪种方法可能更快(sapply 或 ddply),以及
  • ii) 使用该方法可以解决如何将 V1 列拆分为两个所需的组成列的问题?

第 2 部分 - 收集一个 itemID 的所有主题为了加分...我需要完成的任务的第二部分是获取 260 万行(现在分为 3 列)并折叠每一行以获得 itemID,以便所有主题都保存在一个单元格中。

输出最终应该看起来像...

  itemID    topic
1 2286 E11,ECAT,M11,M12,MCAT
2 2287 C24

谁能推荐一种简单的方法来将这样的行聚集到一个单元格中?

最佳答案

我们可以使用几个选项来提高速度。

<强>1。 stringi

stringi 包中的函数通常更快。我们可以使用 stri_extract_all_regex 和适当的 regex 来提取字母数字字符。在这里,我根据显示的示例使用 [[:alnum:]]{2,}rbind 列表元素(do.call(rbind.data.frame,..)),用setNames改变列名,转换'data.frame' 到 'data.table' (setDT),并粘贴按 'itemID' (toString) 分组的 'topic' 元素- 是 paste(., collapse=', ') 的包装器。

library(stringi)
library(data.table)
setDT(setNames(do.call(rbind.data.frame,stri_extract_all_regex(df$V1,
'[[:alnum:]]{2,}')), c('topic', 'itemID')))[,
list(topic=toString(topic)), itemID]
# itemID topic
#1: 2286 E11, ECAT, M11, M12, MCAT
#2: 2287 C24

<强>2。 dplyr/tidyr

我们可以使用 extract from tidyr 将单列转换为多列,方法是指定适当的正则表达式并粘贴 'topic' 元素按“itemID”分组

library(dplyr)
library(tidyr)
extract(df, V1, into= c('topic', 'itemID'), '([^ ]+) ([^ ]+).*',
convert=TRUE) %>%
group_by(itemID) %>%
summarise(topic=toString(topic))
# itemID topic
#1 2286 E11, ECAT, M11, M12, MCAT
#2 2287 C24

关于R Plyr Sapply 似乎真的很慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29298117/

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