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

R 将数据帧传递给函数,保留原始列属性,r,attributes,structure,R,Attributes,Structure,我应该知道,但我不知道。这是因为R中的因素可能是一场噩梦。这是一项后续行动。我希望你们中的一些人能够比R手册更详细地解释如何在向自定义函数传递数据帧时保留列属性。到目前为止,我找到的最有用的信息来自哈德利的高级R编程网站。但这一部分很短。以下是我所拥有的: 编辑:我已经将添加到我的GitHub中(编辑:链接现在转到gsub.dataframe.R)。另外,我想我可能有一个很好的方法来确定是否在新的数据帧中设置stringsAsFactors=FALSE。或者,作为一个更简单的选择,我可以添加一

我应该知道,但我不知道。这是因为R中的因素可能是一场噩梦。这是一项后续行动。我希望你们中的一些人能够比R手册更详细地解释如何在向自定义函数传递数据帧时保留列属性。到目前为止,我找到的最有用的信息来自哈德利的高级R编程网站。但这一部分很短。以下是我所拥有的:


编辑:我已经将添加到我的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])
使用
sub
参数调用
gsub
时不
NULL

和往常一样,我感谢你的帮助



注意:我采纳了哈德利的建议(你为什么不呢?)并将其分为两个函数。下面我的答案是一个新函数,它只调用
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

您是否希望列
int
的类在插入
XXX
后仍保持整数?(也许你认为XXX会被强迫成为NA)问得好。我还没有完全考虑到这一点,但我可能希望在数据帧中有一列混合字母数字(即24EX6,或类似的东西)的情况下,将其强制为
字符
。也许
NA
会更好?另一个主要问题是,
character
列到底发生了什么?这种行为是预期的,因为
gsub
返回字符向量,而
data.frame
默认情况下会将字符串强制为因子。请看一看。您可以替换您的
dc
> args(grep.dataframe)
function (pattern, X, sub = NULL, ...) 
NULL
.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
> 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"