【发布时间】:2011-11-10 07:49:10
【问题描述】:
作为了解我的数据的一部分,我正在尝试获取大型数据框中每一列的最小值/最大值。我的第一次尝试是:
apply(t,2,max,na.rm=1)
它将所有内容都视为字符向量,因为前几列是字符类型。所以一些数字列的最大值是" -99.5"。
然后我尝试了这个:
sapply(t,max,na.rm=1)
但它抱怨 max 对于因素没有意义。 (lapply 是一样的。)让我困惑的是 apply 认为 max 对因素非常有意义,例如它为第 1 列返回“ZEBRA”。
顺便说一句,我查看了Using sapply on vector of POSIXct,其中一个答案是“当您使用 sapply 时,您的对象被强制转换为数字,...”。这是发生在我身上的事吗?如果是这样,是否有不强制的替代应用功能?当然这是一种常见的需求,因为数据框类型的一个关键特性是每一列都可以是不同的类型。
【问题讨论】:
-
我只会传递具有有意义数据类型的列来计算您的统计数据。
-
@Roman 谢谢,这实际上是我昨天所做的,因为在这种特殊情况下,我已经有了一个数字列名列表。但对于大型数据帧,它可能会变得很耗时。
-
您可以找到数字列并自动执行该过程。
-
@DarrenCook 作为一种方法,如果您使用 stringsAsFactors = FALSE 读取文件并且在使用
apply之前将列设置为它们应该属于的类,例如日期为 as.POSIXct,数字为数字等,这比在sapply中使用强制转换更容易吗? -
这是一个很好的问题,但仍然没有一种令人满意的方法可以将函数应用于具有混合类型的 data.frame。保留每列类型的唯一解决方案是使用 for 循环; data.frames 没有 lapply 方法。