r - 计算R中数字字符串的变异性指数

标签 r loops

我在一个向量中有数千个数字串,每个数字代表语音单元中的音调实现(下降、上升、下降-上升等)。举例说明:

Tones <- c("2222", "1411", "112", "815", "21111522")

我想为每个字符串获取一个可变性索引,通过

  1. 将字符串中的每个数字与紧邻的下一个数字进行比较,
  2. 如果下一个数字与前一个数字不同,则存储“1” 数量,
  3. 如果下一个数字等于前一个数字,则存储“0”,
  4. 将这些存储的值相加
  5. 将它们除以数字对的总数。

例如,对于“2222”,可变性索引将为 0,因为字符串中的第一个数字等于第二个数字,第二个数字等于第三个数字,第三个数字等于最后一个数字;因此变异性指数将为(0+0+0)/3=0。对于字符串“1411”,索引将为 (1+1+0)/3=0.6666667,因为“1”与“4”不同,“4”与“1”不同,并且“1”等于“1”。

我想必须从分割字符串开始:

TonesSplit <- strsplit(Tones, split="")

它给出一个列表,然后使用for循环和if子句来寻址列表切片中的单元格。只是我不知道该怎么做。我将非常感谢有关如何编程的建议。

最佳答案

一个基本单行R解决方案:

vapply(Tones,function(x) length(rle(charToRaw(x))$lengths)-1,1)/(nchar(Tones)-1)
#     2222      1411       112       815  21111522 
#0.0000000 0.6666667 0.5000000 1.0000000 0.4285714

一些解释:

  • 使用 charToRaw 我得到每个字符串的原始字节内容;
  • 使用rle我得到重复字符序列的数量。变化只是序列数减一;
  • 使用 vapply 我将函数应用于每个字符串;
  • 使用 nchar 我得到每个字符串的字符数。

关于r - 计算R中数字字符串的变异性指数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50793860/

相关文章:

r - 通过列的精确匹配合并数据框

r - 如何在数据框上使用强制转换?

ruby-on-rails - rails : An elegant way to display a message when there are no elements in database

javascript - 使用索引位置按另一个数组中的值过滤数组 - javascript

r - group_by() 到 fill() 没有按预期工作

r - 使用 lubridate 计算日期间隔内的日历天数

java - 我使用 Java 用一种方法编写了一个 "Rock, Paper, Scissor, Shoot"游戏。我需要帮助循环程序

bash - 简单的 6 行 bash 脚本 while 循环...出了什么问题?

r - 创建响应式(Reactive) renderUI

java - while 循环之外的语句被忽略?