извлечь гласные слова и добавить значения гласных R программирование Data science - PullRequest
1 голос
/ 15 апреля 2020

Я новичок в программировании, нас попросили сделать проект

У меня есть значения всех букв (набор данных1)

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

У меня есть список из многих слов (набор данных2 )

Wood
Table
Chair
Desk

Мне нужно извлечь все гласные из слов и сложить их значения гласных и сохранить их в соответствии с соответствующими словами в наборе данных 2 в отдельном столбце.

Желаемый вывод

   Word         Sum_of_vowel_value

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

Я новичок в переполнении стека. Pl извините ошибки, если таковые имеются в публикации

Ответы [ 2 ]

0 голосов
/ 15 апреля 2020

Если вы еще не достигли apply в своем курсе, возможно, вы достигли циклов и регулярных выражений?

Извлеките гласные, используя gsub, заменив не гласные пустым пробелом:

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

Разделите строковые векторы на отдельные буквы.

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

Инициализируйте результаты

dataset2$Score <- 0

Используйте for l oop для подсчета значения гласных с использованием 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

A для l oop в основном аналогично использованию sapply, но намного медленнее.

0 голосов
/ 15 апреля 2020

Вот один грубый подход в базе R:

Разделите каждый символ в Word столбце dataset2, оставьте только гласные и match это с dataset1 s Letter, чтобы получить соответствующие value и sum ит.

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")
...