我有一个data.frame,它是一个单列,有235,886行。每一行对应于英语中的一个单词。
例如。
> words[10000:10005,1]1抗传染病抗传染病抗传统抗传统抗惊厥
6 anticor
我想做的是根据每行中的字母将每行转换为一个数字。所以,如果"a“= 1,"b”= 2,"c“= 3,"d”= 4,那么"abcd“= 10。
我的最终目标是有一个函数,它扫描data.frame中给定的数值,并返回具有该值的所有字符串,即单词。因此,从上面的示例继续,如果我请求值9,此函数将返回"dad“和任何其他数值为9的行。
发布于 2016-03-19 11:31:33
您可以组合使用strsplit和match。我在其中添加了一个tolower,以确保我们匹配的是正确的内容。
下面是一个实现这些步骤的函数:
word_value <- function(words) {
temp <- strsplit(tolower(words), "", TRUE)
vapply(temp, function(x) sum(match(x, letters)), integer(1L))
}下面是一个示例向量:
myvec <- c("and", "dad", "cat", "fox", "mom", "add", "dan")测试一下:
word_value(myvec)
# [1] 19 9 24 45 41 9 19
myvec[word_value(myvec) == 9]
# [1] "dad" "add"
myvec[word_value(myvec) > 20]
# [1] "cat" "fox" "mom"发布于 2016-03-19 11:40:14
您可以使用utf8ToInt。
#using the sample data from Ananda's answer
offset <- utf8ToInt("a") - 1
d <- vapply(tolower(myvec),
function(ii) sum(utf8ToInt(ii) - offset), FUN.VALUE = double(1L))
#and dad cat fox mom add dan
# 19 9 24 45 41 9 19
d[d > 20]
#cat fox mom
# 24 45 41使用偏移量是必要的,因为utf8ToInt("a")是97,但是您希望"a“是1。
如果愿意,使用stack包装将为输出提供不同的格式:
d <- stack(vapply(tolower(myvec),
function(ii) sum(utf8ToInt(ii) - offset), FUN.VALUE = double(1L)))
# values ind
#1 19 and
#2 9 dad
#3 24 cat
#4 45 fox
#5 41 mom
#6 9 add
#7 19 dan
d[d$values > 20,]
# values ind
#3 24 cat
#4 45 fox
#5 41 momhttps://stackoverflow.com/questions/36097446
复制相似问题