Числовой столбец в data.frame, возвращающий «num» с помощью str (), но не is.numeric () - PullRequest
3 голосов
/ 22 января 2010

У меня есть data.frame, d1, который имеет 7 столбцов, 5-7-й столбец должен быть числовым:

str(d1[5])
'data.frame':   871 obs. of  1 variable:
 $ Latest.Assets..Mns.: num  14008 1483 11524 1081 2742 ... 

is.numeric(d1[5])
[1] FALSE

as.numeric(d1[5])
Error: (list) object cannot be coerced to type 'double'

Как это может быть? Если str определяет его как числовой, как он может не быть числовым? Я импортирую из CSV.

Ответы [ 3 ]

4 голосов
/ 22 января 2010
> is.numeric_data.frame=function(x)all(sapply(x,is.numeric))

> is.numeric_data.frame(d1[[5]])
[1] TRUE 

Почему

d1 является списком, следовательно, d1[5] является списком длины 1, и в этом случае содержит data.frame. чтобы получить фрейм данных, используйте d1[[5]].

Даже если фрейм данных содержит числовые данные, сам по себе он не является числовым:

> x = data.frame(1:5,6:10)
> is.numeric(x)
[1] FALSE

Отдельные столбцы в кадре данных являются числовыми или не числовыми. Например:

> z <- data.frame(1:5,letters[1:5])

> is.numeric(z[[1]])
[1] TRUE
> is.numeric(z[[2]])
[1] FALSE

Если вы хотите узнать, являются ли ВСЕ столбцы в фрейме данных числовыми, вы можете использовать all и sapply:

> sapply(z,is.numeric)
    X1.5 letters.1.5. 
    TRUE        FALSE 

> all(sapply(z,is.numeric))
[1] FALSE

> all(sapply(x,is.numeric))
[1] TRUE

Вы можете обернуть все это в удобную функцию:

> is.numeric_data.frame=function(x)all(sapply(x,is.numeric))

> is.numeric_data.frame(d1[[5]])
[1] TRUE 
2 голосов
/ 22 января 2010

d1 [5] не является единственным значением. Это вектор (возможно, список?) Значений. Если вы возьмете одно значение, я уверен, что оно числовое. Например:

is.numeric(d1[5][[1]])
as.numeric(d1[5][[1]])

Так что я думаю, что путаница между объектом столбца и элементами в столбце. R делает различие между этими двумя идеями, в то время как другие языки, такие как SQL, функционально предполагают, что при обсуждении столбца вы обычно ссылаетесь на элементы столбца.

Это обсуждение индексации из документа R Language Definition действительно помогло мне разобраться, как ссылаться на элементы в R.

2 голосов
/ 22 января 2010

Это может быть список (на основании сообщения об ошибке). Вы пробовали class(d1[5])? Если это список, то вы можете ожидать, что d1[[5]] или d1[5][[1]] будут числовыми.

Edit:

Учитывая, что d1 [5] сам по себе является фреймом данных, вам нужно обращаться с ним как таковым. Примерно так должно работать:

is.numeric(d1[5][,1])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...