2

我有一个关于aaply. 我想检查哪一列is.numeric,但返回值aaply有点出乎意料。下面是示例代码。为什么我得到"data.frame"所有列(这解释了为什么即使is.numericFALSE带有数字向量的列)?

谢谢!

data=data.frame(str=rep("str",3),num=c(1:3))

is.numeric(data[,1])
# FALSE
is.numeric(data[,2])
# TRUE

aaply(data,2,is.numeric)
# FALSE FALSE

aaply(data,2,class)
# "data.frame" "data.frame"

编辑:在其他情况下,这会产生警告消息:

aaply(data,2,mean)

# 1: mean(<data.frame>) is deprecated.
#    Use colMeans() or sapply(*, mean) instead. 
4

2 回答 2

4

这是有效的方式aaply,您甚至可以使用identity来查看传递给每个函数调用的内容,一个代表每一列的 data.frame data

aaply(data, 2, identity)
# $num
#   num
# 1   1
# 2   2
# 3   3
# 
# $str
#   str
# 1 str
# 2 str
# 3 str

因此,使用aaply您想要的方式,您必须使用一个函数来提取每个 data.frame 的第一列,例如:

aaply(data, 2, function(df)is.numeric(df[[1]]))
#   num   str 
#  TRUE FALSE 

但这样做似乎要容易得多:

sapply(data, is.numeric)
#   str   num 
# FALSE  TRUE 
于 2012-05-20T13:45:19.643 回答
1

基本原因是您提供了一个不适合使用的类的参数。plyr 函数的第一个字母表示参数的类型,在这种情况下,“a”代表array. 如果您提供一个数组,它会按您的预期工作:

> xx <- plyr::aaply(matrix(1:10, 2), 2, class)
> xx
        1         2         3         4         5 
"integer" "integer" "integer" "integer" "integer" 

至少在我阅读帮助页面之前,这是我的理解。它说应该接受数据帧输入,并且应该输出一个数组。因此,您发现了文档中的错误或函数中的错误。无论哪种方式,处理这个问题的正确位置是在“manipulatr” Google-newsgroup上。@hadley 很有可能会一起解决问题,因为他也是这里的重要贡献者。

于 2012-05-20T14:43:00.123 回答