我有一个data.frame,它是一个包含235,886行的单列。每行对应一个英语单词。
E.g。
na.locf(dcast(dt, row ~ type, value.var = "category"))
# row big medium small
# 1: 0 a b c
# 2: 1 a b d
# 3: 2 a e f
# 4: 3 a e g
# 5: 4 h i j
# 6: 5 h i k
[1]抗癫痫药抗痉挛反常规抗经痉挛抗惊厥 [6]防腐
我想做的是根据其中的字母将每一行转换为数字。所以,如果" a" = 1," b" = 2," c" = 3," d" = 4,然后" abcd" = 10.有没有人知道这样做的方法?
我的最终目标是使用一个函数扫描data.frame以获取给定的数值,并返回所有字符串,即单词,并返回该值。所以,继续上面的例子,如果我要求值9,这个函数将返回" dad"以及数值为9的任何其他行。
答案 0 :(得分:4)
您可以使用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"
答案 1 :(得分:4)
您可以使用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 mom