Как изменить номер участника на указанное значение c? - PullRequest
2 голосов
/ 16 апреля 2020

Я недавно начал использовать R, хотя раньше никогда не кодировал, поэтому я немного застрял в следующей проблеме:

У меня есть два кадра данных (с разными длинами строк и столбцов), которые мне нужно объединить , Само слияние не является проблемой, но у меня есть проблема с разницей переменных в двух моих данных. Первый кадр данных изображает участников как -1, -2, -3 и т. Д. c. Мой второй кадр данных изображает участников как STR_PP001, STR_PP002, STR_PP003 и т. Д. c.

Цель состоит в том, чтобы объединить все данные в одном кадре данных, который изображает участников как STR_PP001 (или любое другое число, которое указывает c участник). Можно ли как-то преобразовать столбец в моем первом кадре данных, чтобы он отображал коды участников как STR_PP вместо -1?

Заранее спасибо!

Ответы [ 3 ]

2 голосов
/ 16 апреля 2020

Пример данных:

a <- paste0("-", 1:4)
a
#[1] "-1" "-2" "-3" "-4"

Преобразование имени

b <- paste0("STR_PP00", sapply(strsplit(a, "-"),"[[", 2))
b
#[1] "STR_PP001" "STR_PP002" "STR_PP003" "STR_PP004"

По сути, этот фрагмент кода делится на "-" где вывод strsplit() является списком. Затем мы используем sapply(), чтобы выбрать второй элемент каждого вектора в нашем списке. После этого можно использовать paste0(), чтобы склеить извлеченный номер и префикс, который вы хотите.


Обновление, чтобы также соответствовать более высоким идентификаторам

a <- paste0("-", 1:128)
b <- "STR_PP"
# Amount of zeros required, -1 because of the "-" that is counted in nchar() 
# -3 becasue the maximum length is 3 for id > 99 and times -1 because we 
# want positive numbers

zerolen <- ((nchar(a) - 1) - 3) * (-1)

# Now one can add the amount of required 0 based on the length of ID number

c <- sapply(zerolen, function(x){
paste(as.character((rep(0, x))), collapse = "")
})

# Again combine with paste()

paste0(b, c, sapply(strsplit(a, "-"),"[[", 2))

# Which results in:

head(paste0(b, c, sapply(strsplit(a, "-"),"[[", 2)), 20)

#  [1] "STR_PP001" "STR_PP002" "STR_PP003" "STR_PP004" "STR_PP005" 
#      "STR_PP006" "STR_PP007" "STR_PP008" "STR_PP009" "STR_PP010"
# [11] "STR_PP011" "STR_PP012" "STR_PP013" "STR_PP014" "STR_PP015" 
#      "STR_PP016" "STR_PP017" "STR_PP018" "STR_PP019" "STR_PP020"
1 голос
/ 16 апреля 2020

Этот вложенный оператор ifelse использует gsub и обратная ссылка работает:

a <- c("-1", "-3", "-10", "-55", "-100", "-112")

ifelse(grepl("-\\d$", a),  paste0("STR_PP00", gsub("-(\\d)", "\\1", a)),
       ifelse(grepl("-\\d{2}$", a),  paste0("STR_PP0", gsub("-(\\d+)", "\\1", a)), 
              paste0("STR_PP", gsub("-(\\d+)", "\\1", a))))

[1] "STR_PP001" "STR_PP003" "STR_PP010" "STR_PP055" "STR_PP100" "STR_PP112"
0 голосов
/ 16 апреля 2020

Но один способ будет работать наверняка: если вы называете свою переменную во втором фрейме данных как VAR, вы можете сделать это:

VAR[which(VAR == -1)] <- "STR_PP001"

и так далее для других номеров. Если -1 символ, вероятно, вам придется установить VAR[which(VAR == "-1")] <- "STR_PP001"

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...