【问题标题】:determining type of data in the input file确定输入文件中的数据类型
【发布时间】:2014-03-21 15:51:09
【问题描述】:

我正在读取前两行这样的文件(列是空格分隔的):

c1 c2 c3 c4 c5

1 2 3 4 5

我想读取前两行并确定第一行是字符向量还是数值向量? (在上面的示例中,它是字符,但在其他文件中它可以是数字)。

我该怎么做?我尝试使用 read.table、data.table 和 fread,但它们都不能正常工作。 read.table 将每个元素转换为整数。你能帮我一个简单的方法吗?

【问题讨论】:

  • 这里是不是有些文件有标题而有些没有?
  • @jlhoward,是的,我想检测文件是否有标题
  • @Elahehkamaliha,那么这个问题与您之前的问题有何不同:stackoverflow.com/questions/22413199/…
  • @Henrik 我试图让它更通用。在这里,我只问如何获取文件中每个单元格的类型(字符、数字、...)
  • @Elahehkamaliha,cmets 中针对您之前的问题提出了几种方法。分享您的尝试对每个人都有帮助。请向我们展示您尝试过的代码以及为什么它不能满足您的需求。这表明您已经花时间尝试帮助自己,它可以避免我们重复明显的答案,它可以帮助您获得更具体和相关的答案。干杯。

标签: r file types data.table


【解决方案1】:

你可以按照

的方式做一些事情
twoLines <- readLines("myFile", nrow=2)
firstLineFields <- strsplit(twoLines, " ")[[1]]
allNumeric <- !any(is.na(as.numeric(firstLineFields)))
allChar <- all(is.na(as.numeric(firstLineFields)))

【讨论】:

    【解决方案2】:

    这应该适合你。

    df <- data.frame(matrix(rnorm(5),ncol=5))
    write.table(df, "hdr.txt", sep=" ")
    write.table(df, "nohdr.txt", sep=" ",col.names=F)
    
    input <- read.table("hdr.txt",colClasses="character",nrows=1) # grab first line
    hdr   <- any(is.na(as.numeric(input)))                   # hdr=T if any character
    hdr
    # [1] TRUE
    
    input <- read.table("nohdr.txt",colClasses="character",nrows=1) # grab first line
    hdr   <- any(is.na(as.numeric(input)))                   # hdr=F if all numeric
    hdr
    # [1] FALSE
    data  <- read.table(header=hdr,...)
    

    所以请阅读第一行,将所有内容强制转换为字符。应用 as.numeric(...) 函数将返回 NA 用于无法强制转换为数字的任何元素。如果发生这种情况,你就有了一个标题。

    【讨论】:

    • 不工作,我认为 read.table 默认将所有元素返回为整数。我的文件有一个标题,但是当我使用你的解决方案时 hdr 是错误的
    • 对不起,应该是as.numeric(...),而不是is.numeric(...)。这就是我没有测试它的结果。
    【解决方案3】:

    您只是在寻找str 函数吗?

    df <- data.frame(number_column = c(1, 2, 3),
                     factor_Column = c('a', 'b', 'c'),
                     date_column = as.Date(c('2014-01-01', '2014-01-01', '2014-01-01'),
                                          format = '%Y-%m-%d'))       
    str(df)
    
    'data.frame':   3 obs. of  3 variables:
     $ number_column: num  1 2 3
     $ factor_Column: Factor w/ 3 levels "a","b","c": 1 2 3
     $ date_column  : Date, format: "2014-01-01" "2014-01-01" ...
    

    【讨论】:

      猜你喜欢
      • 2011-04-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-21
      • 2011-04-30
      相关资源
      最近更新 更多