我在一个向量中有数千个数字串,每个数字代表语音单元中的音调实现(下降、上升、下降-上升等)。举例说明:
Tones <- c("2222", "1411", "112", "815", "21111522")
我想为每个字符串获取一个可变性索引,通过
- 将字符串中的每个数字与紧邻的下一个数字进行比较,
- 如果下一个数字与前一个数字不同,则存储“1” 数量,
- 如果下一个数字等于前一个数字,则存储“0”,
- 将这些存储的值相加
- 将它们除以数字对的总数。
例如,对于“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/