2013-10-13 2 views
0

Я получил следующую задачуКак повторно заменить подстроки в переменных R

Treatment$V010 <- as.numeric(substr(Treatment$V010,1,2)) 
Treatment$V020 <- as.numeric(substr(Treatment$V020,1,2)) 
[...] 
Treatment$V1000 <- as.numeric(substr(Treatment$V1000,1,2)) 

У меня есть 100 переменных от $ V010, V020 $, $ V030 ... до $ V1000. Это цифры разной длины. Я хочу «извлечь» только первые две цифры чисел и заменить старый номер на новый номер длиной две цифры.

В моей базе данных «Обработка» имеется еще 80 переменных, о которых я не упоминал здесь, поэтому моя цель состоит в том, что эта функция будет применяться только к упомянутым 100 переменным.

Как я могу это сделать? Я могу написать эту команду 100 раз, но я уверен, что есть лучшее решение.

ответ

3

Хорошо, давайте сделаем это. Первое, что первый: как вы хотите, чтобы получить определенные столбцы вашего dataframe, вам необходимо указать их имена для доступа к ним:

cnames = paste0('V',formatC(seq(10,1000,by=10), width = 3, format = "d", flag = "0")) 

(cnames вектор, содержащий c('V010','V020', ..., 'V1000'))

Далее, мы получим их индексы:

coli=unlist(sapply(cnames, function (x) which(colnames(Treatment)==x))) 

(coli представляет собой вектор, содержащий индексы в Treatment соответствующих столбцов)

Наконец, мы будем применить функцию над этими столбцами:

Treatment[coli] = mapply(function (x) as.numeric(substr(x, 1, 2)), Treatment[coli]) 

ли работа?

PS: если у кого есть лучше/более лаконичный способ сделать это, скажите, пожалуйста :)

EDIT:

промежуточный шаг не является полезным, поскольку вы уже можете использовать столбец имена cnames получить соответствующие столбцы, т.е.

Treatment[cnames] = mapply(function (x) as.numeric(substr(x, 1, 2)), Treatment[cnames]) 

(единственное преимущество делает преобразование имен столбцов в индексы столбцов, когда есть некоторые недостающие столбцы в dataframe - в т его корпус, Treatment['non existing column'] сбой undefined columns selected)

+1

Обширный и приятно! Я думаю, однако, что вместо подхода 'coli'« Обработка [cnames] »может быть непосредственно использована, потому что« Обработка »уже имеет имена. И тогда работа '_ply'. –

+0

Ницца, спасибо :) Я обновил ответ. – Jealie

+0

Это работает как шарм! Спасибо огромное! – Roccer

1

Решение, в котором соответствующие столбцы выбраны на основе шаблона, который может быть описан с помощью регулярного выражения.

Regex объяснение:
^: Начало строки
V: буквального V
\\d{2}: Ровно 2 цифры

Treatment <- data.frame(V010 = c(120, 130), x010 = c(120, 130), xV1000 = c(111, 222), V1000 = c(111, 222)) 
Treatment 
# V010 x010 xV1000 V1000 
# 1 120 120 111 111 
# 2 130 130 222 222 

# columns with a name that matches the pattern (logical vector) 
idx <- grepl(x = names(Treatment), pattern = "^V\\d{2}") 

# substr the relevant columns 
Treatment[ , idx] <- sapply(Treatment[ , idx], FUN = function(x){ 
    as.numeric(substr(x, 1, 2)) 
    }) 

Treatment 
# V010 x010 xV1000 V1000 
# 1 12 120 111 11 
# 2 13 130 222 22 
+0

Ну, заявленная цель OP заключалась в том, чтобы заменить содержимое «Обработка $ V010' (и далее), а не имена столбца ... – Jealie

+0

Aaah ... Спасибо @Jealie, я неправильно понял вопрос ... I отредактирует мой ответ. – Henrik