在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"
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
出于某种原因,第一列的值会发生变化.我必须在这里做一些明显错误的事情,有人能给我一个解决方法吗?
> 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
Run Code Online (Sandbox Code Playgroud)
正如您在上面所看到的,tmp$X1转换为一个因素,这正是导致您所看到的行为的原因.
尝试:
tmp[,1] <- as.numeric(as.character(tmp[,1]))
Run Code Online (Sandbox Code Playgroud)
@ aix的答案是正确的诊断.但是,您可能想要做的是直接创建数据框:
data.frame(1:10,rep("aa",10))
Run Code Online (Sandbox Code Playgroud)
而不是cbind先(制作矩阵)然后转换为数据帧.
您可能希望通过data.frame上面的命令(X1.10和rep..aa...10.)给出变量合理的名称,而不是它们最终会产生的奇怪名称:
data.frame(var1=1:10,var2=rep("aa",10))
Run Code Online (Sandbox Code Playgroud)
由于data.frame复制了它的参数,你甚至可以将它缩短一点:
data.frame(var1=1:10,var2="aa")
Run Code Online (Sandbox Code Playgroud)
如果你真的想要一个特征向量,而不是第二列的一个因素,你可以使用stringsAsFactors=FALSE或包裹var2中I()(即var2=I("aa"))
| 归档时间: |
|
| 查看次数: |
512 次 |
| 最近记录: |