1

我是编程新手,我们被要求做一个项目

我有所有字母的值(dataset1)

Letter  value
  a     1
  b     2
  c     3
  d     4
  .
  .
  .
  .
  Z     26

我有很多单词的列表(dataset2)

Wood
Table
Chair
Desk

我需要从单词中提取所有元音,并将它们的元音值相加,并将其与数据集 2 中的各个单词存储在单独的列中。

期望的输出

   Word         Sum_of_vowel_value

   Wood                 30        (15+15)
   Table                 6         (1+5)
   Chair                10         (9+1)

我是堆栈溢出的新手。如果发帖有任何错误,请原谅

4

2 回答 2

0

这是基础 R 中的一种粗略方法:

拆分Word列中的每个字符dataset2,只保留元音和match它与dataset1'Letter得到对应的valuesum它。

dataset2$Sum_of_vowel_value <- sapply(strsplit(as.character(dataset2$Word), ""), 
       function(x) sum(dataset1$value[match(vowel[match(tolower(x), vowel)], 
                            dataset1$Letter)], na.rm = TRUE))

dataset2
#   Word Sum_of_vowel_value
#1  Wood                 30
#2 Table                  6
#3 Chair                 10
#4  Desk                  5

为了更好地理解这一点,我们可以逐步分解函数。

我们首先拆分Word成单独的字符

strsplit(as.character(dataset2$Word), "")
#[[1]]
#[1] "W" "o" "o" "d"

#[[2]]
#[1] "T" "a" "b" "l" "e"

#[[3]]
#[1] "C" "h" "a" "i" "r"

#[[4]]
#[1] "D" "e" "s" "k"

下一步是只保留元音。

sapply(strsplit(as.character(dataset2$Word), ""), 
        function(x) vowel[match(tolower(x), vowel)])

#[[1]]
#[1] NA  "o" "o" NA 

#[[2]]
#[1] NA  "a" NA  NA  "e"

#[[3]]
#[1] NA  NA  "a" "i" NA 

#[[4]]
#[1] NA  "e" NA  NA 

现在对于这些元音,我们从dataset1

sapply(strsplit(as.character(dataset2$Word), ""), 
      function(x) dataset1$value[match(vowel[match(tolower(x), vowel)], 
                                        dataset1$Letter)])

#[[1]]
#[1] NA 15 15 NA

#[[2]]
#[1] NA  1 NA NA  5

#[[3]]
#[1] NA NA  1  9 NA

#[[4]]
#[1] NA  5 NA NA

最后,我们将所有这些值相加得到最终输出:

#[1] 30  6 10  5

数据

vowel <- c('a', 'e', 'i', 'o', 'u')
dataset1 <- data.frame(Letter = letters, value = 1:26)
dataset2 <- structure(list(Word = structure(c(4L, 3L, 1L, 2L), 
.Label = c("Chair", "Desk", "Table", "Wood"), class = "factor")), 
row.names = c(NA, -4L), class = "data.frame")
于 2020-04-15T04:39:09.060 回答
0

如果你还没有学apply过你的课程,也许你已经学过循环和正则表达式了?

gsub通过用空格替换非元音来提取元音:

dataset2$Vowels <- gsub("[^aeiou]", "", tolower(dataset2$Word))

将字符串向量拆分为单个字母。

vowels <- strsplit(dataset2$Vowels, "")

初始化分数

dataset2$Score <- 0

使用for循环来计算元音的值match

for(i in 1:length(vowels)){
  dataset2$Score[i] <- sum(dataset1$value[match(vowels[[i]], dataset1$Letter)], na.rm=TRUE)
}

dataset2
#   Word Vowels Score
#1  Wood     oo    30
#2 Table     ae     6
#3 Chair     ai    10
#4  Desk      e     5

for 循环与 using 基本相同,sapply但速度要慢得多。

于 2020-04-15T06:19:57.287 回答