R:根据函数中字符串中的单词数使用粘贴
R: Using paste depending on the number of words in a string within a function
我有一个列表,其中每个列表组件都有一个字符串向量。每个字符串向量的长度为 1,包含一个或多个用空格分隔的单词(原始列表要大得多):
> f <- list("one", "two three", "four", "five six seven")
> f
[[1]]
[1] "one"
[[2]]
[1] "two three"
[[3]]
[1] "four"
[[4]]
[1] "five six seven"
我需要做的是在每个组件中的字符串前后粘贴字符串,具体取决于它是否包含一个或多个单词。我寻找的结果是这样的:
[[1]]
[1] "Single number: one."
[[2]]
[1] "Multiple numbers: two three."
[[3]]
[1] "Single number: four."
[[4]]
[1] "Multiple numbers: five six seven."
我尝试了以下方法,使用 stringr
包中的 str_count
计算每个字符串中的单词数:
x <- lapply(f, function(j) {
if(str_count(string = f[[j]], pattern = "\S+") == 1) {
xx[[j]] <- paste("Single number: ", f[[j]], ".", sep = "")
} else {
xx[[j]] <- paste("Multiple numbers: ", f[[j]], ".", sep = "")
}
})
但是,我收到以下错误:
Error in if (str_count(string = f[[j]], pattern = "\S+") == 1) { :
argument is of length zero
有人可以帮忙吗?
f[[j]]
可以在我们索引列表的元素时使用,即 lapply(seq_along(f),..
,但这里我们在 f
本身上循环。所以,就做 str_count(j,..)
library(stringr)
lapply(f, function(j) {
if(str_count(j, '\S+') >1) {
paste("Multiple numbers: ", j, '.', sep="")
} else paste("Single number: ", j, ".", sep="")
})
#[[1]]
#[1] "Single number: one."
#[[2]]
#[1] "Multiple numbers: two three."
#[[3]]
#[1] "Single number: four."
#[[4]]
#[1] "Multiple numbers: five six seven."
注意:这也可以在不使用任何外部包的情况下完成。
你可以利用 R 的向量化来简化它;但是,这需要使用 vector 作为输入而不是列表——这在您的示例中是可以的:
f = unlist(f)
prefix = ifelse(str_count(f, '\S+') > 1, 'Multiple words: ', 'Single word: ')
paste0(prefix, f, '.')
给定一个字符串,函数 prefix
生成 "Multiple number:"
或 "Single Number:"
。 lapply
到 f
的每个组件,然后使用 Map
将相应的前缀和 f
组件粘贴在一起。没有使用包:
prefix <- function(x) if (any(grepl(" ", x))) "Multiple numbers:" else "Single number:"
Map(paste, lapply(f, prefix), f)
给予:
[[1]]
[1] "Single number: one"
[[2]]
[1] "Multiple numbers: two three"
[[3]]
[1] "Single number: four"
[[4]]
[1] "Multiple numbers: five six seven"
最后一行也可以这样写:
as.list(paste(sapply(f, prefix), f))
如果结果是一个列表并不重要,那么 as.list
可以省略。
我有一个列表,其中每个列表组件都有一个字符串向量。每个字符串向量的长度为 1,包含一个或多个用空格分隔的单词(原始列表要大得多):
> f <- list("one", "two three", "four", "five six seven")
> f
[[1]]
[1] "one"
[[2]]
[1] "two three"
[[3]]
[1] "four"
[[4]]
[1] "five six seven"
我需要做的是在每个组件中的字符串前后粘贴字符串,具体取决于它是否包含一个或多个单词。我寻找的结果是这样的:
[[1]]
[1] "Single number: one."
[[2]]
[1] "Multiple numbers: two three."
[[3]]
[1] "Single number: four."
[[4]]
[1] "Multiple numbers: five six seven."
我尝试了以下方法,使用 stringr
包中的 str_count
计算每个字符串中的单词数:
x <- lapply(f, function(j) {
if(str_count(string = f[[j]], pattern = "\S+") == 1) {
xx[[j]] <- paste("Single number: ", f[[j]], ".", sep = "")
} else {
xx[[j]] <- paste("Multiple numbers: ", f[[j]], ".", sep = "")
}
})
但是,我收到以下错误:
Error in if (str_count(string = f[[j]], pattern = "\S+") == 1) { :
argument is of length zero
有人可以帮忙吗?
f[[j]]
可以在我们索引列表的元素时使用,即 lapply(seq_along(f),..
,但这里我们在 f
本身上循环。所以,就做 str_count(j,..)
library(stringr)
lapply(f, function(j) {
if(str_count(j, '\S+') >1) {
paste("Multiple numbers: ", j, '.', sep="")
} else paste("Single number: ", j, ".", sep="")
})
#[[1]]
#[1] "Single number: one."
#[[2]]
#[1] "Multiple numbers: two three."
#[[3]]
#[1] "Single number: four."
#[[4]]
#[1] "Multiple numbers: five six seven."
注意:这也可以在不使用任何外部包的情况下完成。
你可以利用 R 的向量化来简化它;但是,这需要使用 vector 作为输入而不是列表——这在您的示例中是可以的:
f = unlist(f)
prefix = ifelse(str_count(f, '\S+') > 1, 'Multiple words: ', 'Single word: ')
paste0(prefix, f, '.')
给定一个字符串,函数 prefix
生成 "Multiple number:"
或 "Single Number:"
。 lapply
到 f
的每个组件,然后使用 Map
将相应的前缀和 f
组件粘贴在一起。没有使用包:
prefix <- function(x) if (any(grepl(" ", x))) "Multiple numbers:" else "Single number:"
Map(paste, lapply(f, prefix), f)
给予:
[[1]]
[1] "Single number: one"
[[2]]
[1] "Multiple numbers: two three"
[[3]]
[1] "Single number: four"
[[4]]
[1] "Multiple numbers: five six seven"
最后一行也可以这样写:
as.list(paste(sapply(f, prefix), f))
如果结果是一个列表并不重要,那么 as.list
可以省略。