我应该知道这一点,但我不知道。那是因为R中的因素绝对是一场噩梦。这是我先前问题的跟进。我希望你们中的一些人能够比R手册更详细地说明如何将数据帧传递给自定义函数时如何保留列属性。到目前为止,我挖掘出的最有用的信息是来自Hadley的Advanced R Programming网站。但是该部分很短。这是我所拥有的:
编辑:我已经将源代码添加到我的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
一如既往,我感谢您的帮助。
注意:我接受了Hadley的建议(为什么不呢?),并将其分为两个功能。我在下面的回答是一个仅要求gsub
正则表达式匹配的新函数。
这个小花样的函数可以解决列类问题,该函数可以根据原始对象重新分配类。
.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"
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句