2012-01-30 7 views
3

Я читал this question в SO и задавался вопросом, есть ли способ использовать is.numeric в векторном виде. Дело в том, что если у вас есть векторизованный способ проверить, является ли переменная числовой, то любая функция, зависящая от переменной, являющейся числовой, может быть векторизованной. В противном случае он не может быть векторизован.Есть ли векторизованный способ использования is.numeric?

+0

'is.numeric' векторизован ... можете ли вы привести пример того, о чем вы думаете? –

+3

Я предполагаю, что вопроситель думает, что 'is.numeric (1: 5)' должен давать вектор TRUE 5 long, а не один TRUE. так что-то вроде 'sapply (1: 5, is.numeric)' – Justin

+1

@Justin: ах, тогда ответ «нет». Вы не можете смешивать типы в атомном векторе, поэтому было бы излишним возвращать значение «TRUE» или «FALSE» для каждого элемента вектора. Вы можете смешивать типы в списке (это то, что такое data.frame), и именно там вы должны использовать свое 'sapply' решение. –

ответ

7

По комментариям:

, если вы хотите, чтобы проверить столбцы data.frame с as.numeric, используйте apply

> 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 

Или, для разнообразия, вы можете использовать colwise из plyr пакет:

> colwise(is.numeric)(dat) 
    v1 v2 v3 v4 
1 TRUE FALSE TRUE FALSE 
+1

Пакет 'plyr' имеет функцию' numcolwise', которая автоматически может применять любую функцию к числовым столбцам в фрейме данных. – Ramnath

0

Это должно дать желаемый результат:

rep(is.numeric(x), length(x)) 
+1

Однако, учитывая смешанный список: 'x <-list ('a', 2, 'c', 4)', это даст вектор всей 'FALSE', поскольку' is.numeric (x) 'is' FALSE' , 'lapply (x, is.numeric)' дает ожидаемые результаты. – Justin

+0

@Justin: Я ожидал, что вход будет одной «переменной», которую я принял как атомный вектор. Для разных интерпретаций формулировки hte вопроса ваш метод может (l) применяться. –

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