2012-04-03 2 views
1

Я понимаю ответ в R на повторяющиеся вещи, как правило, «apply()», а не цикл. Есть ли лучший образец R-дизайна для неприятного кода, который я часто создаю?Изменить столбцы в кадре данных в R более чисто - возможно, используя() или apply()?

Итак, вытаскивая табличные данные из HTML, мне обычно нужно изменить тип данных и в итоге запустить что-то вроде этого, чтобы преобразовать первый формат столбца в дату (из десятичной) и столбцы 2-4 из строк символов с запятой тысяч разделителей, таких как «2,400,000», с числовым «2400000».

X[,1] <- decYY2YY(as.numeric(X[,1])) 
X[,2] <- as.numeric(gsub(",", "", X[,2])) 
X[,3] <- as.numeric(gsub(",", "", X[,3])) 
X[,4] <- as.numeric(gsub(",", "", X[,4])) 

мне не нравится, что у меня есть X [, число] повторяется на обоих левых перехватывающих сторон здесь, или что у меня есть в основном то же самое заявление повторяется для 2-4.

Есть ли способ R-стиля, позволяющий сделать X [, 2] менее повторяющимся, но все же без петли? Что-то вроде «применимо» к столбцам 2,3,4 --- функция, которая переназначает текущий столбец модифицированной версии на месте? »

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

ответ

3

Предполагая, что X представляет собой кадр данных, я хотел бы сделать:

X[2:4] <- lapply(X[2:4], function (x) as.numeric(gsub(",", "", x))) 
+0

Это именно то, что я имел в виду. Я не думаю, что, хотя вы знаете способ устранить, с X [2: 4] в качестве назначения с обеих сторон? – Mittenchops

+0

Если вы хотите применить преобразование к каждому столбцу, вы можете сделать X [] <- lapply (X, function (x) as.numeric (gsub ("", "", Икс))) –

2

Что-то вроде

comma2numeric <- function(x) { as.numeric(gsub(",","",x)) } 
X[,2:4] <- apply(X[,2:4],2,comma2numeric) 

начало. transform - хорошая идиома изменения в месте, но она работает с именами, а не с номерами столбцов.

отредактирован: отсутствует крупная скобку в строке 1

+0

Есть некоторые хитрости для определения функций в одной строке? Когда я запускаю 'comma2numeric <- function (x) {as.numeric (gsub (", "," ", x)}' Я получаю сообщение об ошибке «Ошибка: неожиданно»} в «comma2numeric <- function (x) {as.numeric (gsub (",", "", x)} ", который фиксируется, когда я изменяю определение функции на 3 строки, причем только одна строка в последней строке.} – Mittenchops

+0

Mittenchops. (gsub (",", "", x) –

+0

Я включил '{}' (хотя и ненужный), потому что я думаю, что он добавляет немного –