使用 sapply/lapply 或 foreach 访问数据属性 R
Use sapply/lapply or foreach to access data attributes R
这可能是一个非常基本的问题,但老实说,我针对这些类似问题尝试了一些解决方案,但无法在我的数据上取得成功。这可能是因为我的数据,或者我今天过得很辛苦,什么也想不通。 :(
我有一个句子向量
vec = c("having many items", "have an apple", "item")
此外,我有一个数据框来对数据进行词形还原
lem = data.frame(pattern = c("(items)|(item)", "(has)|(have)|(having)|(had)"), replacement = c("item", "have"))
lem$pattern = as.character(lem$pattern)
lem$replacement = as.character(lem$replacement)
我想遍历 lem
数据框中的每一行以形成替换命令。
选项 1:
library(stringr) #this is said to be quicker than gsub and my data has 3 mil sentences
vec <- sapply(lem, function(x) str_replace_all(vec, pattern=x$pattern, replacement = x$replacement))
Error in x$pattern : $ operator is invalid for atomic vectors
选项 2:
library(doPar)
vec <- foreach(i = 1:nrow(lem)) %dopar% {
str_replace_all(vec, pattern = lem[i, "pattern"], replacement = lem[i, "replacement"])
}
选项2 returns 2个向量的列表:第一个是我想要的,第二个是原来的,我不知道为什么。另外,我在我的机器上测试过,doPar
(尽管使用并行编程)不如 sapply
快。
由于我的数据很大(300万句),有人可以推荐一种有效的方法来对文本数据进行词形还原吗?
您可以使用 stringi
库中的 stri_replace_all_regex
,它将按顺序执行您的替换:
library(stringi)
stri_replace_all_regex(vec,lem$pattern,lem$replacement,vectorize_all=F)
[1] "have many item" "have an apple" "item"
另一种选择是从您的模式和替换向量而不是数据框创建命名向量,然后直接使用 str_replace_all
,如下所示:
library(stringr)
vec <- c("having many items", "has an apple", "items")
lem <- c("item", "have")
names(lem) <- c("(items)|(item)", "(has)|(have)|(having)|(had)")
str_replace_all(vec, lem)
## "have many item" "have an apple" "item"
这可能是一个非常基本的问题,但老实说,我针对这些类似问题尝试了一些解决方案,但无法在我的数据上取得成功。这可能是因为我的数据,或者我今天过得很辛苦,什么也想不通。 :(
我有一个句子向量
vec = c("having many items", "have an apple", "item")
此外,我有一个数据框来对数据进行词形还原
lem = data.frame(pattern = c("(items)|(item)", "(has)|(have)|(having)|(had)"), replacement = c("item", "have"))
lem$pattern = as.character(lem$pattern)
lem$replacement = as.character(lem$replacement)
我想遍历 lem
数据框中的每一行以形成替换命令。
选项 1:
library(stringr) #this is said to be quicker than gsub and my data has 3 mil sentences
vec <- sapply(lem, function(x) str_replace_all(vec, pattern=x$pattern, replacement = x$replacement))
Error in x$pattern : $ operator is invalid for atomic vectors
选项 2:
library(doPar)
vec <- foreach(i = 1:nrow(lem)) %dopar% {
str_replace_all(vec, pattern = lem[i, "pattern"], replacement = lem[i, "replacement"])
}
选项2 returns 2个向量的列表:第一个是我想要的,第二个是原来的,我不知道为什么。另外,我在我的机器上测试过,doPar
(尽管使用并行编程)不如 sapply
快。
由于我的数据很大(300万句),有人可以推荐一种有效的方法来对文本数据进行词形还原吗?
您可以使用 stringi
库中的 stri_replace_all_regex
,它将按顺序执行您的替换:
library(stringi)
stri_replace_all_regex(vec,lem$pattern,lem$replacement,vectorize_all=F)
[1] "have many item" "have an apple" "item"
另一种选择是从您的模式和替换向量而不是数据框创建命名向量,然后直接使用 str_replace_all
,如下所示:
library(stringr)
vec <- c("having many items", "has an apple", "items")
lem <- c("item", "have")
names(lem) <- c("(items)|(item)", "(has)|(have)|(having)|(had)")
str_replace_all(vec, lem)
## "have many item" "have an apple" "item"