当df还包含字符串时,将data.frame转换为数字矩阵的正确方法是什么?

时间:2013-05-13 09:11:00

标签: r if-statement matrix numeric

我有一个.csv文件中的数据框,其中包含数字和字符值。我想将此数据帧转换为矩阵。所有包含信息的都是数字(我删除的非数字行),因此应该可以将数据帧转换为数字矩阵。但是,我确实得到了一个字符矩阵。

我发现解决此问题的唯一方法是对每一行使用as.numeric,但这非常耗时。我很确定有一种方法可以使用某种if(i in 1:n)形式来实现这一点,但我无法弄清楚它是如何工作的。或者是真正开始使用数值的唯一方法,例如此处提出的建议(Making matrix numeric and name orders)?

对大多数人来说,这可能是一件非常容易的事情: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

感谢您的帮助!

6 个答案:

答案 0 :(得分:51)

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.

答案 1 :(得分:50)

编辑2:请参阅@ flodel的回答。好多了。

尝试:

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

编辑: 或者@ CarlWitthoft在评论中建议:

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

答案 2 :(得分:6)

如果数据框只包含数字,这是另一种方法。



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




但是将数据帧转换为矩阵的最可靠方法是使用data.matrix()函数。

答案 3 :(得分:0)

我有同样的问题,我就这样解决了 获取没有行名的原始数据框并稍后添加

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

答案 4 :(得分:-1)

另一种方法是使用read.table()参数colClasses通过制作colClasses=c(*column class types*)来指定列类型。 如果有6列其成员需要作为数字,则需要重复六次用逗号分隔的字符串"numeric",导入数据框和as.matrix()数据框。 附:看起来你有标题,所以我把header=T

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

答案 5 :(得分:-2)

我通过导出CSV然后编辑并重新导入来手动填充NAs,如下所示。

也许你们中的一位专家可能会解释为什么这个程序运作良好 (第一个文件的列数据类型为charINTnum(浮点数)),这些列在步骤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!

自动识别