转换为data.frame时修改的矩阵列的数值

时间:2012-05-14 14:43:57

标签: r

在R 2.13上运行,我希望有一个包含多个列的data.frame,第一个是数字类型,另一个是字符类型。当我创建我的对象时,第一列的值将以我不期望或理解的方式进行转换。请参阅下面的代码。

  

tmp< - cbind(1:10,rep(“aa”,10))

     

TMP

  [,1] [,2]
[1,] "1"  "aa"
[2,] "2"  "aa"
[3,] "3"  "aa"
[4,] "4"  "aa"
[5,] "5"  "aa"
[6,] "6"  "aa"
[7,] "7"  "aa"
[8,] "8"  "aa"
[9,] "9"  "aa"
[10,] "10" "aa"
  

tmp< - data.frame(tmp)

     

TMP

   X1 X2
1   1 aa
2   2 aa
3   3 aa
4   4 aa
5   5 aa
6   6 aa
7   7 aa
8   8 aa
9   9 aa
10 10 aa
  

tmp [,1]< - as.numeric(tmp [,1])

     

TMP

   X1 X2
1   1 aa
2   3 aa
3   4 aa
4   5 aa
5   6 aa
6   7 aa
7   8 aa
8   9 aa
9  10 aa
10  2 aa

由于某种原因,第一列的值会发生变化。我必须在这里做一些明显错误的事情,有人能给我一个解决方法吗?

2 个答案:

答案 0 :(得分:6)

> tmp <- data.frame(cbind(1:10,rep("aa",10)))
> str(tmp)
'data.frame':   10 obs. of  2 variables:
 $ X1: Factor w/ 10 levels "1","10","2","3",..: 1 3 4 5 6 7 8 9 10 2
 $ X2: Factor w/ 1 level "aa": 1 1 1 1 1 1 1 1 1 1

正如您在上面所看到的,tmp$X1被转换为一个因素,这正是导致您所看到的行为的原因。

尝试:

tmp[,1] <- as.numeric(as.character(tmp[,1]))

答案 1 :(得分:5)

@ aix的答案是正确的诊断。但是,您可能想要做的是直接创建数据框:

data.frame(1:10,rep("aa",10))

而不是cbind首先(生成矩阵)然后转换为数据框。

您可能希望通过上面的data.frame命令(X1.10rep..aa...10.)为变量提供合理的名称而不是奇怪的名称:

data.frame(var1=1:10,var2=rep("aa",10))

由于data.frame复制了它的参数,你可以将它缩短一点:

data.frame(var1=1:10,var2="aa")

如果你真的想要一个字符向量而不是第二列的因子,你可以在stringsAsFactors=FALSE中使用var2或包裹I()(即var2=I("aa"))< / p>