根据R中字符串中的字母分配数值

时间:2016-03-19 03:23:52

标签: r

我有一个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的任何其他行。

2 个答案:

答案 0 :(得分:4)

您可以使用strsplitmatch的组合。我在那里扔了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