将函数应用于数据框中的每个列,观察每个列的现有数据类型

Dar*_*ook 49 r apply sapply

我正在尝试获取大型数据框中每列的最小值/最大值,作为了解我的数据的一部分.我的第一次尝试是:

apply(t,2,max,na.rm=1)
Run Code Online (Sandbox Code Playgroud)

它将所有内容视为字符向量,因为前几列是字符类型.所以一些数字列的最大值出来了" -99.5".

然后我尝试了这个:

sapply(t,max,na.rm=1)
Run Code Online (Sandbox Code Playgroud)

但它抱怨最大因素没有意义.(lapply是一样的.)令我困惑的是,apply思想max对于因素非常有意义,例如它为第1列返回了"ZEBRA".

顺便说一下,我看了一下在POSIXct矢量使用sapply,其中一个答案是" 当你使用sapply时,你的对象被强制为数字,...... ".这是发生在我身上的事吗?如果是这样,是否有一个不强制的替代应用功能?当然这是一个常见的需求,因为数据框类型的一个关键特征是每列可以是不同的类型.

42-*_*42- 35

如果它是一个"有序因素",事情会有所不同.这并不是说我喜欢"有序因素",我不这么说,只是说某些关系是为"因子"定义的"有序因子"定义的.因素被认为是普通的分类变量.您正在查看因素的自然排序顺序,这些因素是您的语言环境的字母词汇顺序.如果你想为每一列,...日期和因素以及所有列自动强制为"数字",那么尝试:

sapply(df, function(x) max(as.numeric(x)) )   # not generally a useful result
Run Code Online (Sandbox Code Playgroud)

或者,如果您想先测试因子并按预期返回:

sapply( df, function(x) if("factor" %in% class(x) ) { 
            max(as.numeric(as.character(x)))
            } else { max(x) } )
Run Code Online (Sandbox Code Playgroud)

@Darrens的评论确实有效:

 sapply(df, function(x) max(as.character(x)) )  
Run Code Online (Sandbox Code Playgroud)

max 用字符向量成功.


jor*_*ran 17

其原因max与工作原理apply是,apply首先强迫你的数据帧的矩阵,矩阵只能存储一个数据类型.所以你最终会得到一个字符矩阵.sapply只是一个包装器lapply,因此两者产生相同的错误并不奇怪.

创建数据框时的默认行为是将分类列存储为因子.除非你指定它是一个有序的因素,如操作maxmin将是不确定的,因为R为假设你已经创建了一个无序的因素.

您可以通过指定改变这种行为options(stringsAsFactors = FALSE),这将改变默认的整个会话,或者您也可以通过stringsAsFactors = FALSEdata.frame()建设呼叫本身.请注意,这只是意味着minmax将承担默认"字母"排序.

或者您可以手动指定每个因素的排序,但我怀疑这是您想要做的.

无论如何,sapply通常会产生原子向量,这将需要在很多情况下将所有内容转换为字符.解决这个问题的方法如下:

#Some test data
d <- data.frame(v1 = runif(10), v2 = letters[1:10], 
                v3 = rnorm(10), v4 = LETTERS[1:10],stringsAsFactors = TRUE)

d[4,] <- NA

#Similar function to DWin's answer          
fun <- function(x){
    if(is.numeric(x)){max(x,na.rm = 1)}
    else{max(as.character(x),na.rm=1)}
}   

#Use colwise from plyr package
colwise(fun)(d)
         v1 v2       v3 v4
1 0.8478983  j 1.999435  J
Run Code Online (Sandbox Code Playgroud)


Ita*_*mar 7

如果您想了解您的数据,请summary (df)提供最小值,第1个分位数,中位数和平均值,第3个分位数和最大数值列以及因子列的最高级别的频率.