【问题标题】:How can I prevent leading spaces when transforming integer columns to character in R?将整数列转换为 R 中的字符时,如何防止前导空格?
【发布时间】:2014-03-07 14:43:09
【问题描述】:

我有一个带有字符和整数列的 data.frame。我想将它们全部转换为字符,但我得到了数字列不需要的前导空格:

> example <- data.frame(a=1:10,b=1:10,c=rep("foo",10))
> apply(example,2,format,trim=T)
      a    b    c    
 [1,] " 1" " 1" "foo"
 [2,] " 2" " 2" "foo"
 [3,] " 3" " 3" "foo"
 [4,] " 4" " 4" "foo"
 [5,] " 5" " 5" "foo"
 [6,] " 6" " 6" "foo"
 [7,] " 7" " 7" "foo"
 [8,] " 8" " 8" "foo"
 [9,] " 9" " 9" "foo"
[10,] "10" "10" "foo"

trim=T 参数显然被忽略了。这只发生在字符列'c' 存在的情况下,即如果'c' 不存在(apply(example[,-3],...)),它可以正常工作。

【问题讨论】:

    标签: r dataframe type-conversion


    【解决方案1】:

    如果我没记错的话,是因为as.matrix,但是你可以使用sapply绕过这个:

    > sapply(example, format, trim = TRUE)
          a    b    c    
     [1,] "1"  "1"  "foo"
     [2,] "2"  "2"  "foo"
     [3,] "3"  "3"  "foo"
     [4,] "4"  "4"  "foo"
     [5,] "5"  "5"  "foo"
     [6,] "6"  "6"  "foo"
     [7,] "7"  "7"  "foo"
     [8,] "8"  "8"  "foo"
     [9,] "9"  "9"  "foo"
    [10,] "10" "10" "foo"
    

    【讨论】:

      【解决方案2】:

      如果您对字符矩阵作为输出没问题(您似乎基于您对apply 的使用,请尝试):

      do.call(cbind, lapply(example, as.character))
      

      这会产生:

            a    b    c    
       [1,] "1"  "1"  "foo"
       [2,] "2"  "2"  "foo"
       [3,] "3"  "3"  "foo"
       [4,] "4"  "4"  "foo"
       [5,] "5"  "5"  "foo"
       [6,] "6"  "6"  "foo"
       [7,] "7"  "7"  "foo"
       [8,] "8"  "8"  "foo"
       [9,] "9"  "9"  "foo"
      [10,] "10" "10" "foo"
      

      【讨论】:

      • +1 刚刚注意到你在我之前发布了这个。我的答案并没有太大的不同......
      • 也许甚至sapply(example, as.character) 以节省一些输入;)
      【解决方案3】:

      正如?apply 中所说,第一个参数被强制转换为矩阵。在这种情况下,由于列c,它将其转换为字符矩阵。对as.matrix 的调用会创建前导空格。随后对format 的调用什么也不做,因为数据已经是字符了。

      > as.matrix(example)
            a    b    c    
       [1,] " 1" " 1" "foo"
       [2,] " 2" " 2" "foo"
       [3,] " 3" " 3" "foo"
       [4,] " 4" " 4" "foo"
       [5,] " 5" " 5" "foo"
       [6,] " 6" " 6" "foo"
       [7,] " 7" " 7" "foo"
       [8,] " 8" " 8" "foo"
       [9,] " 9" " 9" "foo"
      [10,] "10" "10" "foo"
      

      如果没有c列,则转换为整数矩阵,format将整数转换为字符。

      > as.matrix(example[,-3])
             a  b
       [1,]  1  1
       [2,]  2  2
       [3,]  3  3
       [4,]  4  4
       [5,]  5  5
       [6,]  6  6
       [7,]  7  7
       [8,]  8  8
       [9,]  9  9
      [10,] 10 10
      

      最好直接使用lapply

      example <- data.frame(a=1:10,b=1:10,c=rep("foo",10))
      example[] <- lapply(example, format, trim=TRUE)
      # use sapply if you really want a matrix
      example <- sapply(example, format, trim=TRUE)
      

      【讨论】:

      • +1 指的是手册页中的内容,而不是我只是说我似乎记得 :-)
      猜你喜欢
      • 2022-08-13
      • 1970-01-01
      • 1970-01-01
      • 2023-02-09
      • 2019-05-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-28
      相关资源
      最近更新 更多