【问题标题】:numerical values of the column of a matrix getting modified when converting into data.frame转换为data.frame时矩阵列的数值被修改
【发布时间】:2012-05-14 14:43:56
【问题描述】:

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

tmp

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

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]

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

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

【问题讨论】:

    标签: r


    【解决方案1】:
    > 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]))
    

    【讨论】:

      【解决方案2】:

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

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

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

      您可能希望通过上面的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")

      【讨论】:

      • 在我给你的例子中是对的,但我真正想做的是转换一个更大的矩阵。我的第一列是我原始输入的几列的函数,然后其他列也是原始输入的函数(我保留的东西,我最初修改的东西)。所以我将使用 as.numeric(as.character(xx)) 而不是直接使用 data.frame。
      • 我仍然怀疑有一种方法可以直接使用 data.frame() 进行操作,但这取决于您。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-01-06
      • 2017-12-22
      • 2021-12-23
      • 2019-09-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多