2014-09-18 6 views
0

В фрейме данных я хочу иметь возможность разделять столбцы с числовыми типами из столбцов со строками/символами.Является ли это принуждением? Почему R говорит мне, что это одни и те же типы данных?

Вот мои данные:

test=data.frame(col1=sample(1:20,10),col2=sample(31:50,10), 
col3=sample(101:150,10),col4=sample(c('a','b','c'),10,replace=T)) 

который выглядит как

col1 col2 col3 col4 
1  2 41 132 c 
2 11 47 141 b 
3 13 39 135 a 
4 12 31 117 b 
5 19 42 106 a 
6  8 50 118 a 
7 14 33 149 a 
8  6 48 148 b 
9 16 37 150 b 
10 9 34 140 a 

Теперь вот странное дело, если я TypeOf строке/цв, содержащего символ, R говорит, что это целое число

> typeof(test[1,4]) 
[1] "integer" 

Если я что-то вроде этого

> apply(test,2,typeof) 
     col1  col2  col3  col4 
"character" "character" "character" "character" 

R говорит, что все они персонажи. Кроме того,

> lapply(test,typeof) 
[1] "integer" "integer" "integer" "integer" 

Опять же, что происходит, и есть хороший способ, чтобы различать между колоннами с символами и столбцами с целыми числами?

ответ

2

apply работает с массивами и матрицами, а не с кадрами данных.

Для работы с фреймом данных он сначала преобразует его в матрицу.

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

Как вы видели, sapply - это путь, и class - это, вероятно, то, что вы хотите узнать. Хотя есть и mode, typoeof и storage.mode в зависимости от того, что вы хотите знать:

> test$col5=letters[1:10] # really character, not a factor 
> test$col3=test$col3*pi # lets get some decimals in there 


> sapply(test, mode) 
     col1  col2  col3  col4  col5 
    "numeric" "numeric" "numeric" "numeric" "character" 
> sapply(test, class) 
     col1  col2  col3  col4  col5 
    "integer" "integer" "numeric" "factor" "character" 
> sapply(test, typeof) 
     col1  col2  col3  col4  col5 
    "integer" "integer" "double" "integer" "character" 
> sapply(test, storage.mode) 
     col1  col2  col3  col4  col5 
    "integer" "integer" "double" "integer" "character" 
+0

В столбце data.frame отсутствует столбец символов. Это фактор. – Roland

+0

Правда. 'apply' коэрцирует факторы в символы, см .:' as.matrix (test) ' – Spacedman

0

Хорошо, я понял, мой собственный вопрос, извините:

sapply(test,class) 
0

col4 является фактором:

str(test) 
#'data.frame': 10 obs. of 4 variables: 
#$ col1: int 11 14 8 19 10 12 7 18 3 16 
#$ col2: int 46 39 35 38 42 37 34 32 41 31 
#$ col3: int 113 147 138 118 132 139 131 119 108 111 
#$ col4: Factor w/ 3 levels "a","b","c": 1 3 2 3 2 3 3 3 1 3 

фактор внутренне представляет собой целое число (по данным typeof) с классом factor и a levels атрибут. apply заставляет data.frame к матрице. Так как матрица может содержать только один тип данных, перед применением typeof все привязывается к символам.

Использовать class, чтобы различать типы данных и lapply (или sapply), чтобы пересечь столбцы.

0

data.frame (COL4 = образец (с ('A', 'B', 'C'), 10, заменить = T)) col4 является фактором.

apply (test, 2, typeof): если тусклый (тест) == 2L он будет использовать as.matrix (test) во-первых.

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

  • Нет связанных вопросов^_^