2016-05-04 3 views
2

При написании R код для идентификации столбцов с числовыми данными, у меня были некоторые проблемы, и нашел этот вопрос на SO: Is there a vectorized way to use is.numeric?is.numeric в применить против sapply

В пределах этой странице я нашел свой ответ, но я озадачен по характеру самой проблемы. На этой странице, следующий код надрез делает то, что я ожидал:

> dat <- data.frame(v1=1:5,v2=letters[1:5],v3=rnorm(5),v4=c(1,2,'c','d',5)) 

> sapply(dat,is.numeric) 

    v1 v2 v3 v4 
TRUE FALSE TRUE FALSE 

Но если я изменю sapply применить, я к тому, что вызвало мою проблему.

> dat <- data.frame(v1=1:5,v2=letters[1:5],v3=rnorm(5),v4=c(1,2,'c','d',5)) 

> apply(dat,2,is.numeric) 

    v1 v2 v3 v4 
FALSE FALSE FALSE FALSE 

Зачем наносить и обрабатывать результаты в разных оценках?

+5

'help (apply)' - * Если 'X' не является массивом, а объектом класса с непустым значением dim (например, фреймом данных), применяйте попытки принуждения его к массиву через' as.matrix', если он двумерный (например, кадр данных) или через 'as.array'. * –

+1

' apply' и 'lapply' - разные функции, поэтому неудивительно, что они дают разные результаты. Имейте в виду полностью понять, что они делают и когда они должны использоваться. – nicola

+0

@RichardScriven - благодарю вас за эту деталь. Я не видел этого в применении - я упустил из виду или не понял его в правильном контексте. Я бы поднял или согласился, что ты ответишь, если сможешь. – KirkDCO

ответ

7

apply коэрцирует все в одном и том же виде. Числа могут стать символами, но не наоборот. Таким образом, все применяется к character для применения к работе.

> apply(dat[,1, drop = F], 2, is.numeric) 
    v1 
TRUE 
+2

Правила принуждения перечислены в этом ответе, если кто-то заинтересован - http://stackoverflow.com/questions/17030173/why-does-hello-0-return-true/17030209#17030209 - 'character> complex> numeric > целое> логическое> raw' – thelatemail

1

apply не рекомендуется для фреймов данных, как это будет принуждать к матрице. Матрица, поскольку вы, вероятно, знаете, что все столбцы в матрице должны иметь один и тот же режим (числовой, символ и т. Д.) ... по умолчанию apply преобразует столбцы в символ.

Смежные вопросы