Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 字符串中的字符频率_R - Fatal编程技术网

R 字符串中的字符频率

R 字符串中的字符频率,r,R,我想创建一个带有两个参数的函数,它们将显示给定单词中字符的频率:x正如Frank所指出的,通常最好避免循环。您可以很容易地这样做: word <-"Word" y <-"d" sum(unlist(strsplit(word,""))==y) [1] 1 word不使用for循环的另一种方法是使用table函数,该函数返回一个命名的频率向量。您还需要在使用strsplit后取消列表,因为它返回一个列表。最后,我使用了函数tolower,以防字符串与大写字母一起使用(例如,“香蕉”

我想创建一个带有两个参数的函数,它们将显示给定单词中字符的频率:x正如Frank所指出的,通常最好避免循环。您可以很容易地这样做:

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