我应该知道这一点,但我不知道。那是因为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
进行正则表达式匹配。
答案 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"