Перебирайте список и извлекайте последний символ - PullRequest
0 голосов
/ 05 мая 2018

Я хочу представить вам случай, который занимает несколько часов: при попытке перебрать список, чтобы извлечь из него последний символ, мне нужна последняя буква, обозначающая размер футболки:

  Lineitem.name
1 T-Shirt Donna "Si dai. Ciao." - M

2 T-Shirt Donna "Honey" - L

3 T-Shirt Donna "Si dai. Ciao." - M

4 T-Shirt Donna "I do very bad things" - M

5 T-Shirt Donna "Si dai. Ciao." - M

6 T-Shirt Donna "Stai nel tuo (mind your business)" - White / S

7 T-Shirt Donna "Stay Stronz" - White / L

8 T-Shirt Donna "Stay Stronz" - White / M

9 T-Shirt Donna "Si dai. Ciao." - S

10 T-Shirt Donna "Je suis esaurit" - Black / S

пока я пытался так:

 tshirt_sizes <- orders[18] #18 because its the 18th column in my df
 subst = function(x,n){
  substring(x,nchar(x)-n+1)
 }
 #looping through the list 
 typeof(tshirt_sizes)

 for(i in tshirt_sizes[]) {
   tshirt_sizes[2] <- subst(i, 1)
   }
 #Using this for loop i get this error:
  Error in nchar(x) : 'nchar()' requires a character vector 

 #second attempt using apply()
 apply(tshirt_sizes,1, subst)
 #Using this i get this error: 
 Error in substring(x, nchar(x) - n + 1) : 
   argument "n" is missing, with no default 

1 Ответ

0 голосов
/ 05 мая 2018

Это можно сделать в одну строку с помощью магии регулярных выражений:

gsub('.*(.)$', '\\1', orders[[18]])

Обратите внимание на использование двойных скобок (orders[[18]]), поскольку для gsub требуется вектор, а не список. Регулярное выражение гласит: «вернуть единственный символ, который появляется перед концом строки».

Поскольку вас особенно интересует последний символ каждой строки, вы также можете избежать регулярных выражений и сделать это следующим образом:

split <- strsplit(orders[[18]], '')
reversed <- lapply(split, rev)
last_char <- lapply(reversed, '[', 1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...