R-код, который применяет функцию к подразделу переменных в фрейме данных и сохраняет его в исходном фрейме данных - PullRequest
3 голосов
/ 26 марта 2011

У меня есть такой фрейм данных, как mtcars

Я хочу запрограммировать функцию, которая ищет все переменные mtcars, которые начинаются с "c", преобразует их в символы и сохраняет их обратно в mtcars.

Ответы [ 2 ]

4 голосов
/ 26 марта 2011

Вот один из способов:

f <- function(x, str = "^var") {
    want <- grep(str, names(x))
    x[, want] <- sapply(x[, want], as.character)
    x
}

[Редактировать: альтернативная версия, которая реализует точки, поднятые @hadley в комментариях.]

f <- function(x, str = "^var") {
    want <- grepl(str, names(x))
    x[, want] <- lapply(x[, want], as.character)
    x
}

Функция позволяет проходить черезстрока, которой вы хотите соответствовать, но по умолчанию "^var", как вы и просили."^" означает, что мы хотим найти имена, начинающиеся с "var", а не имена, содержащие "var".

Пример:

> bigdf <- data.frame(var1 = LETTERS[1:3], var2 = letters[1:3], var3 = 1:3, 
+                     stuff = 4:6)
> bigdf
  var1 var2 var3 stuff
1    A    a    1     4
2    B    b    2     5
3    C    c    3     6
> 
> bigdf2 <- f(bigdf)
> bigdf2
  var1 var2 var3 stuff
1    A    a    1     4
2    B    b    2     5
3    C    c    3     6
> str(bigdf2)
'data.frame':   3 obs. of  4 variables:
 $ var1 : chr  "A" "B" "C"
 $ var2 : chr  "a" "b" "c"
 $ var3 : chr  "1" "2" "3"
 $ stuff: int  4 5 6
2 голосов
/ 26 марта 2011

Другой вариант, который иллюстрирует другие возможности grep и другую версию, оператор "[":

f <- function(x, str = "^var") {
    want <- grep(str, names(x), value=TRUE)
    x[want] <- lapply(x[want], as.character)
    x
}

Аргумент value = TRUE возвращает совпадающие имена, а не их позицию.Вам на самом деле не нужно использовать [ , want], и вместо этого вы можете просто использовать [want], так как это полная операция по столбцам.Проверено, чтобы увидеть, что он (и версии Симпсона) возвращает полный data.frame, даже если столбцы не совпадают.Пожалуйста, не «принимайте» этот ответ ... это не намного больше, чем комментарий, но очень сложно прочитать структуру функций в комментариях.

...