【问题标题】:remove all quotation marks from a data frame从数据框中删除所有引号
【发布时间】:2014-03-06 15:46:24
【问题描述】:

我有一个数据框rep,看起来像这样:

> head(rep)
     position chrom  value label  
[1,] "17408"  "chr1" "0"   "miRNA"
[2,] "17409"  "chr1" "0"   "miRNA"
[3,] "17410"  "chr1" "0"   "miRNA"
[4,] "17411"  "chr1" "0"   "miRNA"
[5,] "17412"  "chr1" "0"   "miRNA"
[6,] "17413"  "chr1" "0"   "miRNA"

如何删除所有元素的引号?

注意:rep$position 和 rep$value 应该是 numeric 类型,rep$chrom 和 rep$label 应该是 character 类型。

【问题讨论】:

  • -1 声称有一个 data.frame 显然是一个矩阵。

标签: r dataframe removeall quotation-marks


【解决方案1】:

两个步骤:1)去掉引号,2)相应地转换列:

数据

x <- read.table(text='
position chrom  value label  
"\\"17408\\""  "\\"chr1\\"" "\\"0\\""   "\\"miRNA\\""
"\\"17409\\""  "\\"chr1\\"" "\\"0\\""   "\\"miRNA\\""'
, header=T)

1) 去掉引号

library(stringr)
library(plyr)

del <- colwise(function(x) str_replace_all(x, '\"', ""))
x <- del(x)

2) 相应地转换列

num <- colwise(as.numeric)    
x[c(1,3)] <- num(x[c(1,3)])
x

  position chrom value label
1    17408  chr1     0 miRNA
2    17409  chr1     0 miRNA

【讨论】:

    【解决方案2】:

    正如@Roland 所指出的,您有一个matrix,而不是data.frame,它们有不同的默认print 方法。坚持使用matrix,您可以在print 中显式设置quote = FALSE,也可以使用noquote。

    这是一个基本的例子:

    ## Sample data
    x <- matrix(c(17, "chr1", 0, "miRNA", 18, "chr1", 0, "miRNA"), nrow = 2, 
                byrow = TRUE, dimnames = list(
                  NULL, c("position", "chrom", "value", "label")))
    
    ## Default printing
    x
    #      position chrom  value label  
    # [1,] "17"     "chr1" "0"   "miRNA"
    # [2,] "18"     "chr1" "0"   "miRNA"
    
    ## Two options to make the quotes disappear
    print(x, quote = FALSE)
    #      position chrom value label
    # [1,] 17       chr1  0     miRNA
    # [2,] 18       chr1  0     miRNA
    noquote(x)
    #      position chrom value label
    # [1,] 17       chr1  0     miRNA
    # [2,] 18       chr1  0     miRNA
    

    此外,正如您自己发现的那样,将您的 matrix 转换为 data.frame 会使引号消失。如果每列是不同类型的数据(数字、字符、因子等),data.frame 是更适合保存数据的结构。但是,将matrix 转换为data.frame 不会自动为您处理列的转换。相反,您可以使用type.convert(在使用read.table 和家庭创建data.frame 时也使用它):

    y <- data.frame(x, stringsAsFactors = FALSE)
    str(y)
    # 'data.frame':  2 obs. of  4 variables:
    #  $ position: chr  "17" "18"
    #  $ chrom   : chr  "chr1" "chr1"
    #  $ value   : chr  "0" "0"
    #  $ label   : chr  "miRNA" "miRNA"
    y[] <- lapply(y, type.convert)
    str(y)
    # 'data.frame':  2 obs. of  4 variables:
    #  $ position: int  17 18
    #  $ chrom   : Factor w/ 1 level "chr1": 1 1
    #  $ value   : int  0 0
    #  $ label   : Factor w/ 1 level "miRNA": 1 1
    y
    #   position chrom value label
    # 1       17  chr1     0 miRNA
    # 2       18  chr1     0 miRNA
    

    【讨论】:

    • 谢谢,这很有帮助。我不确定单独使用rep &lt;- data.frame(rep) 是否足够。我希望我能给你更多的声望点。
    • @biohazard,取决于数据! data.frame(rep)(原样)将为您的每个列创建因子,这可能是您想要的,也可能不是。如果您想复制 read.table 体验,我提供了 type.convert 选项。
    【解决方案3】:

    我想我找到了答案。我拥有的不是data.frame,而是矩阵。将其转换为 data.frame 摆脱了引号。我仍然想知道为什么....

    rep <- data.frame(rep)
    > head(rep)
      position chrom value label
    1    17408  chr1     0 miRNA
    2    17409  chr1     0 miRNA
    3    17410  chr1     0 miRNA
    4    17411  chr1     0 miRNA
    5    17412  chr1     0 miRNA
    6    17413  chr1     0 miRNA
    

    【讨论】:

    • print data.frames 和 matrices 的方法不同,这就是原因。
    猜你喜欢
    • 1970-01-01
    • 2022-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-26
    • 2021-05-05
    相关资源
    最近更新 更多