Добавьте 1 к определенной буквенно-цифровой строке кадра данных в R

#r

Вопрос:

Я довольно новичок в R, поэтому был бы очень признателен вам за помощь!

Это мой текущий фрейм данных с именем «track_data».

введите описание изображения здесь

Что я пытаюсь сделать, так это изменить строку 11 в классе на «T43», строку 12 на «T44», также пытаясь сделать то же самое для всех классов комбинаций, поэтому: строка 13 на «T45», строка 14 на «T46» и строка 15 на «T47».

что я пытался сделать, так это найти, какие классы являются классами комбинаций, и определить уникальные векторы:

 #Change Class to appropriate names
a <- which(nchar(track_data$Class) > 3)
b <- unique(track_data$Class[a])
#T43/44
 for (r in a)
  if(track_data$Class[r] == b[1]){
  print(paste("Row", r))
  for (class in 1:r) 
   track_data$Class[r] <- substr(track_data$Class[r],1,3)
  }
 

И я бы повторил это для других пунктов b, которые являются «T45-47» и «T53/54».

Это дает мне:

введите описание изображения здесь

Теперь мне просто нужно найти строку, которая дублируется, и 1 к классу, но я продолжаю получать ошибки, потому что мне также нужно добавить букву «Т».

Если есть более простой/ эффективный способ выполнения моей задачи, пожалуйста, дайте мне знать!

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

Ответ №1:

Мы можем сделать

 library(dplyr)
library(purrr)
library(stringr)
track_data %>%
    group_by(Class) %>% 
    mutate(Class2 = if(n() > 1) str_c("T", 
      unlist(map(str_extract_all(str_remove(first(Class),
        "T"), "\d "),
        ~
            seq(as.numeric(.x[1]), as.numeric(.x[2]), by = 1)))) else Class) %>%
       ungroup %>% 
       mutate(Class = Class2, Class2 = NULL)
 

-выход

 # A tibble: 8 × 1
  Class
  <chr>
1 T11  
2 T36  
3 T42  
4 T43  
5 T44  
6 T45  
7 T46  
8 T47  
 

данные

 track_data <- structure(list(Class = c("T11", "T36", "T42", "T43/44", "T43/44", 
"T45-47", "T45-47", "T45-47")), class = c("tbl_df", "tbl", "data.frame"
), row.names = c(NA, -8L))
 

Ответ №2:

 #Change Class to appropriate names
a <- which(nchar(field_data$Class) > 3)
previous <- ""
increment <- 0
for (r in a){
 print(paste(r))
 print(paste(previous))
 print(paste(field_data$Class[r]))
 if (previous != field_data$Class[r]){
  result <- str_match(field_data$Class[r],"([T|F])([0-9] )")
  print(paste(result))
  t_or_f <- result[2]
  number <- as.integer(result[3])
  previous <- field_data$Class[r]
  field_data$Class[r] <- paste(t_or_f, number, sep = "")
  increment <- 0
 } else {
 increment <- increment   1
 field_data$Class[r] <- paste(t_or_f, number   increment, sep = "")
 } 
}