преобразование значений в нескольких столбцах фрейма данных в целое число

#r #dataframe

#r #фрейм данных

Вопрос:

У меня есть такой фрейм данных:

 V1  V2   V3   V4   V5   V6   V7   V8   V9   V10   V11
8   10   0.2  0.4   0   0.0  1.2  0.2  4.2  3.4   2.5
4   5    1.0   0    2   4.5   0   1.1   0    1    2.0
.....................................
 

т. е. столбцы из V2-V11 имеют некоторые десятичные значения. Что я хочу сделать, так это то, что все они в нескольких строках (2000) преобразуются в целые числа.

Я попытался использовать

 apply(df, 1, as.integer())
 

Но это не работает.

Комментарии:

1. Сказать » это не сработало » редко бывает полезно. В этом случае сообщение об ошибке было бы информативным (вместо того, чтобы люди предполагали, что вы получили нежелательный результат). 'as.integer()' is not a function, character or symbol . Вы имели в виду apply( df , 1 , as.integer ) . Они () используются в командной строке, поэтому анализатор понимает, что он вызывает функцию. Нет необходимости сопоставлять функцию с именем, заданным в качестве аргумента другой функции.

Ответ №1:

Вы также можете создать класс

 setClass("NumerictoInteger")
setAs("character", "NumerictoInteger", function(from) as.integer(from))
dat <- read.table(text="V1  V2   V3   V4   V5   V6   V7   V8   V9   V10   V11
8   10   0.2  0.4   0   0.0  1.2  0.2  4.2  3.4   2.5
4   5    1.0   0    2   4.5   0   1.1   0    1      2.0",sep="",header=T,stringsAsFactors=FALSE,colClasses="NumerictoInteger")

dat
  V1 V2 V3 V4 V5 V6 V7 V8 V9 V10 V11
1  8 10  0  0  0  0  1  0  4   3   2
2  4  5  1  0  2  4  0  1  0   1   2
 

Ответ №2:

Из документации he R для as.integer :

Нецелые числовые значения усекаются до нуля (т.Е., Поскольку.integer(x) там равно trunc(x)), а мнимые части комплексных чисел отбрасываются (с предупреждением).

Похоже, мы можем использовать только trunc здесь.

 > trunc(df)
#   V1 V2 V3 V4 V5 V6 V7 V8 V9 V10 V11
# 1  8 10  0  0  0  0  1  0  4   3   2
# 2  4  5  1  0  2  4  0  1  0   1   2
 

Комментарии:

1. Однако, если я вижу размеры, в моем фрейме данных было 7357 строк в 27 столбцах. Однако после того, как я применю это, результатом будет большая матрица с 198639 элементами. Почему это так?

2. После того , как ты позвонишь floor() ? Или sapply() ? Я удалил sapply()

3. Я использовала sapply и применяю и то, и другое. Оба ведут к этой матрице.

4. Он прекрасно работает с полом. Однако нет, с помощью apply и sapply это приводит к формированию матрицы с разными размерами, имеющей 198639 элементов

5. Не используйте apply , это приведет к принудительному преобразованию в матрицу, которую вам придется преобразовать обратно. floor должен быть метод для data.frame s, так как он сохраняет структуру нетронутой.