将数据帧传递给函数,保留原始列属性

时间:2014-05-26 05:43:50

标签: r attributes structure

我应该知道这一点,但我不知道。那是因为R中的因素可能是绝对的噩梦。这是my previous question的后续行动。我希望你们中的一些人能够比R手册更详细地解释在将数据框传递给自定义函数时如何保留列属性。到目前为止,我挖出的最有用的信息来自Hadley的 Advanced R Programming 网站。但那部分很短。这就是我所拥有的:


编辑:我已将source code添加到我的GitHub(编辑:链接现在转到gsub.dataframe.R)。另外,我想我可能有一个很好的方法来确定是否在新数据框中设置stringsAsFactors = FALSE。或者,作为一个更容易的替代方案,我可以添加stringsAsFactors参数。是否可以将...用于多个进一步的参数集?就像让...成为grep data.frame的进一步论据一样?


设置一些数据

set.seed(24)
num <- rep(1, 10); int <- 1:10; fac <- sample(LETTERS[1:3], 10, TRUE)
D <- data.frame(num, int, fac); D$char <- as.character(letters[1:10])

这是对自定义函数的调用,以及结果。

(newD <- grep.dataframe("6|(a|f)", D, sub = "XXX", ignore.case = TRUE))
#    num int fac char
# 1    1   1 XXX  XXX
# 2    1   2   B    b
# 3    1   3   C    c
# 4    1   4 XXX    d
# 5    1   5 XXX    e
# 6    1 XXX   C  XXX
# 7    1   7 XXX    g
# 8    1   8   B    h
# 9    1   9   B    i
# 10   1  10 XXX    j

我没有做过任何事情,但已经尝试了我能想到的一切,尽可能多地保留有关列的信息(即class(x) <-attr(x, "name") <-attributes(x) <-I(x)等)。您在上面看到的结果绝对正确。但是,下面的结果令人不安。我可以使用一点帮助来获得最终数据结构以匹配原始数据结构。我在想switch声明可能会有这个诀窍吗?

请注意

> args(grep.dataframe)
function (pattern, X, sub = NULL, ...) 
NULL

sub参数在gsub

时调用NULL

一如既往,我很感激帮助。


注意:我接受了哈德利的建议(为什么不呢?)并将其拆分为两个功能。我在下面的回答是一个新函数,只调用gsub进行正则表达式匹配。

1 个答案:

答案 0 :(得分:1)

使用函数的这个小花花公子来解决列类问题,该函数根据原始文件重新分配类。

.reClass <- function(x, type)
{
    switch(type,
           character = as.character(x),
           integer = as.integer(x),
           factor = as.factor(x),
           numeric = as.numeric(x))
}

> args(gsub.dataframe)
function (pattern, replacement, data, use.nums = FALSE, ...) 
NULL

use.nums用于“使用数字?”,是否替换数字列上的模式。 D是原始数据,用于将其列替换(在某些条件下)。

> sapply(D, class)
#        num         int         fac        char 
#  "numeric"   "integer"    "factor" "character" 
> x <- gsub.dataframe("2|A", "XXX", data = D, ignore.case = TRUE)
> x
#    num int fac char
# 1    1   1   C  XXX
# 2    1   2   B    b
# 3    1   3 XXX    c
# 4    1   4 XXX    d
# 5    1   5   C    e
# 6    1   6 XXX    f
# 7    1   7   C    g
# 8    1   8 XXX    h
# 9    1   9   B    i
# 10   1  10 XXX    j
> sapply(x, class)
#       num         int         fac        char 
# "numeric"   "integer"    "factor" "character"