Как применить «mutate» к каждому элементу столбца, если элементы отличаются друг от друга? - PullRequest
0 голосов
/ 27 сентября 2019

Я проанализировал корпус, и теперь у меня есть что-то вроде этого, от text1 :

  doc_id sentence_id token_id        token        lemma   pos   entity
1  text1           1        1 Introductory introductory   ADJ         
2  text1           1        2    statement    statement  NOUN         
3  text1           1        3         with         with   ADP         
4  text1           1        4          Q&A          Q&A PROPN    ORG_B
5  text1           1        5         \n           \n   SPACE         
6  text1           1        6         Jean         Jean PROPN PERSON_B

до text100

doc_id sentence_id token_id token  lemma   pos entity
758712 text100         273       32  task   task  NOUN       
758713 text100         273       33     .      . PUNCT       
758714 text100         273       34              SPACE       
758715 text100         274        1 Thank  thank  VERB       
758716 text100         274        2   you -PRON-  PRON       
758717 text100         274        3     .      . PUNCT   

Теперь я пытаюсь изменить каждый элемент столбца doc_id , чтобы при появлении text1 он отображался text134 при наличии text2 появится text135 и т. Д. (В основном от 1-100 до 134-233).

Я только что сделал это для text1 , используя следующий код:

parse2 %>% mutate(doc_id = recode(doc_id, text1 = "text134"))

Как применить одну и ту же логику к каждому тексту от 1 до 100?Пытаюсь создать какой-нибудь цикл, но я совсем новичок в R, и я просто застрял с ним.

Вы можете мне помочь?

Спасибо большое!

Ответы [ 3 ]

1 голос
/ 27 сентября 2019

С данными Ронака

df %>%
    mutate(doc_id = paste0("text", 133 + as.integer(gsub("text(\\d+)", "\\1", doc_id))))
#  id  doc_id
#1  1 text134
#2  2 text134
#3  3 text134
#4  4 text135
#5  5 text135
#6  6 text135
#7  7 text136
#8  8 text136
#9  9 text136
1 голос
/ 27 сентября 2019

Мы можем использовать str_c из stringr вместе с parse_number из readr

library(stringr)
library(readr)
library(dplyr)
df1 %>%
     mutate(new_id = str_c("text", parse_number(doc_id) + 133))
#  id doc_id  new_id
#1  1  text1 text134
#2  2  text1 text134
#3  3  text1 text134
#4  4  text2 text135
#5  5  text2 text135
#6  6  text2 text135
#7  7  text3 text136
#8  8  text3 text136
#9  9  text3 text136

Или другой вариант - преобразовать 'doc_id' в индекс matchс элементами unique, добавьте 133 и paste с 'текстом'

df1 %>%
    mutate(doc_id = str_c('text', 133 + match(doc_id, unique(doc_id))))

Также можно использовать с base R

df1$doc_id <- with(df1, paste0('text', 133 + match(doc_id, unique(doc_id))))

data

df1 <- structure(list(id = 1:9, doc_id = c("text1", "text1", "text1", 
"text2", "text2", "text2", "text3", "text3", "text3")), row.names = c(NA, 
-9L), class = "data.frame")
1 голос
/ 27 сентября 2019

Удалите текст из doc_id, чтобы остались только цифры, и добавьте к нему 133, чтобы получить new_id.

transform(df, new_id = paste0("text", as.integer(sub("\\D+", "", doc_id)) + 133))
#Or if it is always "text" in doc_id remove that directly
#transform(df, new_id = paste0("text", as.integer(sub("text", "", doc_id)) + 133))

#  id doc_id  new_id
#1  1  text1 text134
#2  2  text1 text134
#3  3  text1 text134
#4  4  text2 text135
#5  5  text2 text135
#6  6  text2 text135
#7  7  text3 text136
#8  8  text3 text136
#9  9  text3 text136

данные

df <- structure(list(id = 1:9, doc_id = structure(c(1L, 1L, 1L, 2L, 
2L, 2L, 3L, 3L, 3L), .Label = c("text1", "text2", "text3"), 
class = "factor")), class = "data.frame", row.names = c(NA, -9L))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...