Причина, по которой max
работает с apply
, заключается в том, что apply
сначала приводит ваш кадр данных к матрице, и матрица может содержать только один тип данных.Таким образом, вы получите матрицу символов.sapply
- это просто оболочка для lapply
, поэтому неудивительно, что оба выдают одну и ту же ошибку.
Поведение по умолчанию при создании фрейма данных для категориальных столбцов, которые должны храниться как факторы .Если вы не укажете, что это упорядоченный коэффициент , такие операции, как max
и min
, будут неопределенными, поскольку R предполагает, что вы создали неупорядоченный фактор.
Вы можете изменить это поведение, указав options(stringsAsFactors = FALSE)
, который изменит значение по умолчанию для всего сеанса, или вы можете передать stringsAsFactors = FALSE
в самом вызове конструкции data.frame()
.Обратите внимание, что это просто означает, что min
и max
примут «алфавитный» порядок по умолчанию.
Или вы можете вручную указать порядок для каждого фактора, хотя я сомневаюсь, что это то, что вы хотите сделать.
Независимо от этого, 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