3

我有一个像 mtcars 这样的数据框

我想编写一个函数来搜索以“c”开头的 mtcars 的所有变量,将它们转换为字符并将它们保存回 mtcars。

4

2 回答 2

4

这是一种方法:

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
于 2011-03-26T12:11:55.267 回答
2

另一个变体说明了 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,即使没有列匹配。请不要“接受”这个答案......这只不过是一个评论,但在评论中阅读函数结构真的很难。

于 2011-03-26T17:47:48.587 回答