R 字符串中的字符频率
我想创建一个带有两个参数的函数,它们将显示给定单词中字符的频率:x正如Frank所指出的,通常最好避免循环。您可以很容易地这样做:R 字符串中的字符频率,r,R,我想创建一个带有两个参数的函数,它们将显示给定单词中字符的频率:x正如Frank所指出的,通常最好避免循环。您可以很容易地这样做: word <-"Word" y <-"d" sum(unlist(strsplit(word,""))==y) [1] 1 word不使用for循环的另一种方法是使用table函数,该函数返回一个命名的频率向量。您还需要在使用strsplit后取消列表,因为它返回一个列表。最后,我使用了函数tolower,以防字符串与大写字母一起使用(例如,“香蕉”
word <-"Word"
y <-"d"
sum(unlist(strsplit(word,""))==y)
[1] 1
word不使用for
循环的另一种方法是使用table
函数,该函数返回一个命名的频率向量。您还需要在使用strsplit后取消列表,因为它返回一个列表。最后,我使用了函数tolower
,以防字符串与大写字母一起使用(例如,“香蕉”被转换为“香蕉”)
请注意,这仅在提供单个单词时有效,如果将字符串添加到x
,则需要对该函数进行泛化,以分别返回每个单词的频率。我不知道这是否是您需要使用strsplit()执行的操作。如果没有:
x逻辑看起来都是正确的。所以有些事情并不是你想象的那样
在您的控制台中查看word[i]
。这是一张单子。第一个元素描述类型,第二个元素描述值。因此,您将数组与字母进行比较
Browse[2]> word <- strsplit("something",'')
Browse[2]> word[0]
list()
Browse[2]> word[1]
[[1]]
[1] "s" "o" "m" "e" "t" "h" "i" "n" "g"
另一个版本是将“单词”翻译成raw()
向量,并将“字母”作为raw()
向量进行比较
frequency = function(word, letter)
sum(charToRaw(word) == charToRaw(letter))
这里有四种不同的解决方案
f0 <- function(word, letter)
sum(strsplit(word, "")[[1]] == letter)
f1 <- function(word, letter)
sum(charToRaw(word) == charToRaw(letter))
f2a <- function(word, letter)
length(unlist(gregexpr(letter, word)))
f2b <- function(word, letter)
length(unlist(gregexpr(letter, word, fixed=TRUE)))
f0字母相同(f0(单词,字母),f1(单词,字母))
[1] 真的
>相同(f0(单词,字母),f2a(单词,字母))
[1] 假的
>相同(f0(单词,字母),f2b(单词,字母))
[1] 假的
>单词字母微基准(
+f0(单词,字母),f1(单词,字母),
+f2a(单词,字母),f2b(单词,字母)
+ )
单位:微秒
expr最小lq平均uq最大neval
f0(字、字母)558.433562.4755579.03451583.5590584.8920628.946100
f1(字、字母)71.482 78.7100 100.85787 80.0275 81.7035 2195.366 100
f2a(字、字母)277.618278.7280280.94280279.4870280.4270302.683100
f2b(字、字母)66.888 68.1800 69.07205 68.6205 69.3100 84.300 100
f2b()
是最快的,但也不正确f1()
目前看起来既快(虽然速度对手头的任务可能并不重要)又正确。mf代替循环,尝试sum(word==y)
。哦,但是您看到的问题是因为您需要执行strsplit(x,“”[[1]]]
或换行unlist
。谢谢,您能解释一下为什么需要添加[[1]]吗?您需要在末尾返回一个值<代码>打印
将值打印到屏幕上,但返回空对象。将“print(counter)”替换为counter
或return(counter)
。是的,这是必要的,因为strsplit
可以获取字符串向量并拆分它们,处理这种情况的自然方法是返回一个列表。试试strsplit(c(“ABC”、“defg”)
。为了保持输出的一致性,即使只有一个字符串,它也会返回一个列表。[[1]]
提取列表的第一个元素。如果没有匹配项,则返回错误答案,例如,count\u字符串(“foo”,“b”)
Ack。谢谢@MartinMorgan让我看看如何解决这个问题。
mf <- function(x, y){
count <- table(strsplit(x, '')[[1]])
count[names(count) == y]
}
mf('hello world', 'l')
# l
# 3
Browse[2]> word <- strsplit("something",'')
Browse[2]> word[0]
list()
Browse[2]> word[1]
[[1]]
[1] "s" "o" "m" "e" "t" "h" "i" "n" "g"
frequency <- function(x,y)
{
word <- strsplit(x,'')
val <- table(word[1] == y)["TRUE"]
cat(val)
}
frequency("hih","h")
Browse[2]> frequency("hih","h")
2
frequency = function(word, letter)
sum(charToRaw(word) == charToRaw(letter))
f0 <- function(word, letter)
sum(strsplit(word, "")[[1]] == letter)
f1 <- function(word, letter)
sum(charToRaw(word) == charToRaw(letter))
f2a <- function(word, letter)
length(unlist(gregexpr(letter, word)))
f2b <- function(word, letter)
length(unlist(gregexpr(letter, word, fixed=TRUE)))
> word <- "foo"
> letter <- "o"
> identical(f0(word, letter), f1(word, letter))
[1] TRUE
> identical(f0(word, letter), f2a(word, letter))
[1] TRUE
> identical(f0(word, letter), f2b(word, letter))
[1] TRUE
> letter <- "a"
> identical(f0(word, letter), f1(word, letter))
[1] TRUE
> identical(f0(word, letter), f2a(word, letter))
[1] FALSE
> identical(f0(word, letter), f2b(word, letter))
[1] FALSE
> word <- paste(sample(letters, 10000, TRUE), collapse="")
> letter <- "a"
> microbenchmark(
+ f0(word, letter), f1(word, letter),
+ f2a(word, letter), f2b(word, letter)
+ )
Unit: microseconds
expr min lq mean median uq max neval
f0(word, letter) 558.433 562.4755 579.03451 583.5590 584.8920 628.946 100
f1(word, letter) 71.482 78.7100 100.85787 80.0275 81.7035 2195.366 100
f2a(word, letter) 277.618 278.7280 280.94280 279.4870 280.4270 302.683 100
f2b(word, letter) 66.888 68.1800 69.07205 68.6205 69.3100 84.300 100
mf <- function(x, y){
count <- table(strsplit(x, '')[[1]])
count[names(count) == y]
}
mf('hello world', 'l')
# l
# 3