Как заменить последний символ определенных строк в столбце данных? - PullRequest
1 голос
/ 29 октября 2019

У меня есть датафрейм, который включает столбец идентификаторов кодов. Когда код заканчивается на 0, я хочу заменить его на 1.

Через много проб и ошибок у меня есть цикл for, который почти работает. Это работает, когда есть только один код, который заканчивается на 0, и он находится в последней строке кадра данных. Если есть другая строка данных, цикл for не выдает желаемого результата.

library(stringr)

df_a <- data.frame(a = c("02.1.1", "02.1.1.0"))
df_b <- data.frame(a = c("02.1.1", "02.1.1.0", "02.1.2"))

for (i in nrow(df_a)){
  df_a$adj <- ""
  df_a$code_adj <- ""
  if (str_sub(df_a[i, "a"], -1, -1) == "0"){
    df_a[i, "adj"] <- "1"
    df_a[i, "code_adj"] <- paste0(str_sub(df_a[i, "a"], 1, -2), df_a[i, "adj"])
  } 
}

Когда я запускаю цикл for на фрейме данных df_a, он дает желаемый результат. Когда я запускаю его на df_b, это не так.

Я открыт для лучшего подхода к этой проблеме, но я также хотел бы знать, почему цикл for ведет себя так, как он работает на разных фреймах данных.

Ответы [ 2 ]

2 голосов
/ 29 октября 2019

Мы можем создать функцию с sub и повторно использовать ее для нескольких наборов данных. Сопоставьте 0 в конце ($) строки и замените 1 для определенного столбца в наборе данных, обновите столбец и верните набор данных

f1 <- function(dat, colNm) {
      dat[[colNm]] <- sub("0$", "1", dat[[colNm]])
      dat
        }


f1(df_a, "a")
#         a
#1   02.1.1
#2 02.1.1.1

f1(df_b, "a")
#         a
#1   02.1.1
#2 02.1.1.1
#3   02.1.2
1 голос
/ 29 октября 2019

не могли бы вы использовать пакет stringr и сделать что-то вроде df_b <- str_replace(df_b$a, "0$", "1")

, это ищет 0 в конце строки и заменяет его на 1. Просто обратите внимание, что вы должны выполнить преобразованиеперсонажу, поскольку он не работает с факторами, использующими df_b$a <- as.character(df_b$a)

...