(R) Мой цикл for для добавления текста в строковое значение не работает - PullRequest
0 голосов
/ 18 января 2019

Я пытаюсь добавить текст к имени файла в R, используя цикл for, но это не работает. Имена файлов имеют имена от 001 до 100, и я хочу прочитать файлы в R.

Как таковой, я должен добавить «00» к файлам, которые имеют номер имени ниже 10 (например, файлы с 001 по 009), и «0» к файлам в диапазоне 10-100 (например, файлы 010 до 099), поскольку вход в функцию представляет собой диапазон номеров, например файлы 15:70. В противном случае файлы не могут быть прочитаны в R.

Я пытался создать цикл for, используя операторы if в сочетании с функцией вставки, чтобы добавить "00" к именам файлов, но цикл for не выводит правильный новый список элементов:

например. когда я ввожу в функцию файлы 1: 100, я хочу, чтобы цикл for создавал новую переменную с «правильными» именами файлов от 001 до 100 (с правильным количеством «00», добавленным впереди, как это имена файлов каталогов).

convert <- function(id) {   

    for (i in length(id)) {

        if (id[i] > 0 && id[i]<= 10) {
            id[i] <- paste("00", id[i], sep="");    
        }
    }
    print(id); ## prints "10" (?)
}

Поэтому, когда я хочу преобразовать вектор 1:10 или «1, 2, 3, 4 и т. Д.» В «001, 002, 003, 004 и т. Д.», Я хочу сделать это, используя это для петли. Однако выход этой функции составляет всего «10». Таким образом, кажется, что он только переносит последний элемент входного вектора в конец функции.

Может кто-нибудь объяснить, что происходит не так? Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 18 января 2019

Попробуйте это:

vector <- 1:100
vector2 <- character(100)

max.length <- 3

for(i in vector){
  vector2[i] <- paste(c(rep('0', max.length - nchar(vector[i])), 
                        as.character(vector[i])),
                      collapse = "")
}

vector2

  [1] "001" "002" "003" "004" "005" "006" "007" "008" "009" "010" "011" "012" "013"
 [14] "014" "015" "016" "017" "018" "019" "020" "021" "022" "023" "024" "025" "026"
 [27] "027" "028" "029" "030" "031" "032" "033" "034" "035" "036" "037" "038" "039"
 [40] "040" "041" "042" "043" "044" "045" "046" "047" "048" "049" "050" "051" "052"
 [53] "053" "054" "055" "056" "057" "058" "059" "060" "061" "062" "063" "064" "065"
 [66] "066" "067" "068" "069" "070" "071" "072" "073" "074" "075" "076" "077" "078"
 [79] "079" "080" "081" "082" "083" "084" "085" "086" "087" "088" "089" "090" "091"
 [92] "092" "093" "094" "095" "096" "097" "098" "099" "100"

Вы можете изменить аргумент max.length, если хотите добавить больше нулей.

Редактировать: я думаю, что ответ Маркуса проще.

0 голосов
/ 18 января 2019

Вы можете сгенерировать эту последовательность, используя sprintf

sprintf("%03d", 1:100)
#[1] "001" "002" "003" "004" "005" "006" "007" "008" "009" "010" "011" ... "098" "099" "100"
...