#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 = "")
}
}