Подтвердить что ты не робот

Правильный способ преобразования data.frame в числовую матрицу, когда df также содержит строки?

У меня есть кадр данных, взятый из CSV файла, который содержит числовые и символьные значения. Я хочу преобразовать этот фрейм данных в матрицу. Все содержащие информацию - это номера (не номера строк, которые я удалил), поэтому должно быть возможно преобразовать фрейм данных в числовую матрицу. Тем не менее, я получаю матрицу символов.

Я нашел единственный способ решить это использовать as.numeric для каждой строки, но это довольно трудоемко. Я вполне уверен, что есть способ сделать это с помощью какой-то формы if(i in 1:n), но я не могу понять, как это может работать. Или это единственный способ начать с числовых значений, например, предлагаемого здесь (Создание матричных числовых и именных заказов)?

Вероятно, это очень легко для большинства из вас: P

Матрица намного больше, это только первые несколько строк... Вот код:

cbind(
as.numeric(SFI.Matrix[ ,1]),
as.numeric(SFI.Matrix[ ,2]),
as.numeric(SFI.Matrix[ ,3]),
as.numeric(SFI.Matrix[ ,4]),
as.numeric(SFI.Matrix[ ,5]),
as.numeric(SFI.Matrix[ ,6]))  

# to get something like this again:

Social.Assistance Danger.Poverty GINI S80S20 Low.Edu        Unemployment 
0.147             0.125          0.34    5.5   0.149        0.135 0.18683691
0.258             0.229          0.27    3.8   0.211        0.175 0.22329362
0.207             0.119          0.22    3.1   0.139        0.163 0.07170422
0.219             0.166          0.25    3.6   0.114        0.163 0.03638525
0.278             0.218          0.29    4.1   0.270        0.198 0.27407825
0.288             0.204          0.26    3.6   0.303        0.211 0.22372633

Спасибо за помощь!

4b9b3361

Ответ 1

Изменить 2: см. ответ @flodel. Намного лучше.

Попробуйте:

# assuming SFI is your data.frame
as.matrix(sapply(SFI, as.numeric))  

Изменить: или как @CarlWitthoft в комментариях:

matrix(as.numeric(unlist(SFI)),nrow=nrow(SFI))

Ответ 2

data.matrix(SFI)

От ?data.matrix:

Description:

 Return the matrix obtained by converting all the variables in a
 data frame to numeric mode and then binding them together as the
 columns of a matrix.  Factors and ordered factors are replaced by
 their internal codes.

Ответ 3

Вот альтернативный способ, если кадр данных просто содержит числа.

apply(as.matrix.noquote(SFI),2,as.numeric)

Ответ 4

У меня была та же проблема, и я решил это так: взяв исходный кадр данных без имен строк и добавив их позже

SFIo <- as.matrix(apply(SFI[,-1],2,as.numeric))
row.names(SFIo) <- SFI[,1]

Ответ 5

Я вручную заполнял NA, экспортируя CSV, а затем редактируя его и реимпортируя, как показано ниже.

Возможно, один из ваших экспертов мог бы объяснить, почему эта процедура работала так хорошо (первый файл имел столбцы с данными типов char, INT и num (числа с плавающей запятой)), которые после STEP 1 стали типом char; но в конце STEP 3 R правильно распознал тип данных для каждого столбца).

# STEP 1:
MainOptionFile <- read.csv("XLUopt_XLUstk_v3.csv",
                            header=T, stringsAsFactors=FALSE)
#... STEP 2:
TestFrame <- subset(MainOptionFile, str_locate(option_symbol,"120616P00034000") > 0)
write.csv(TestFrame, file = "TestFrame2.csv")
# ...
# STEP 3:
# I made various amendments to `TestFrame2.csv`, including replacing all missing data cells with appropriate numbers. I then read that amended data frame back into R as follows:    
XLU_34P_16Jun12 <- read.csv("TestFrame2_v2.csv",
                            header=T,stringsAsFactors=FALSE)

По возвращении в R все столбцы имели правильные уровни измерения, автоматически распознаваемые R!

Ответ 6

Другой способ сделать это - использовать аргумент colClasses read.table() для указания типа столбца, сделав colClasses=c(*column class types*). Если имеется 6 столбцов, элементы которых вы хотите использовать в числовом формате, вам необходимо повторить строку символов "numeric" шесть раз, as.matrix() запятые, импортируя фрейм данных и as.matrix() фрейм данных. PS похоже, у вас есть заголовки, поэтому я поставил header=T

as.matrix(read.table(SFI.matrix,header=T,
colClasses=c("numeric","numeric","numeric","numeric","numeric","numeric"),
sep=","))