2

我正在尝试读取带有一些空单元格的文件并获得预期的空单元格NA。我有一些特殊的列,它们只能有值'''+'. 所以我想通过使用将这些列设置为因子类

read_tsv('file.txt', 
         col_types=list(
             column_with_empty_cells=col_factor(c('','+'))))

但是该列仍然NAs在这些列中。readr_tsv我可以通过更改参数来更改函数的全局行为na,但这不是我想要的。我只想在特定列中更改它。

有没有办法将这些NAs直接转换为''?之后我肯定可以这样做,但我想知道我是否以错误的方式使用了这个东西。

编辑 这是一个测试文件

我如何实际上传文件?我只能附上图片...

4

3 回答 3

1

您可以使用lapply和创建一个新功能来解决此问题factor

library(readr)

read_tsv2 <- function(file, na.char=" "){
  test <- read_tsv(file = file, col_types=list(column_with_empty_cells=col_character()))
  test <- as.data.frame(test)
  names_tsv <- names(test)
  test <- lapply(test,
         function(x){
    if(sum(is.na(x))!=length(x)){
      x[is.na(x)] <- na.char 
    factor(x,levels = unique(x))
    }else{
      x
    }
  }
  )
  test <- do.call(cbind.data.frame, test)
  names(test) <- names_tsv
  test
}

file <- read_tsv2(file = "~/Downloads/file.txt", na.char = " ")

file

   test column_with_empty_cells
1  <NA>                        
2  <NA>                        
3  <NA>                        
4  <NA>                        
5  <NA>                        
6  <NA>                        
7  <NA>                        
8  <NA>                        
9  <NA>                        
10 <NA>                        
11 <NA>                        
12 <NA>                        
13 <NA>                        
14 <NA>                        
15 <NA>                        
16 <NA>                        
17 <NA>                        
18 <NA>                        
19 <NA>                        
20 <NA>                        
21 <NA>                        
22 <NA>                        
23 <NA>                        
24 <NA>                       +
25 <NA>                       +
26 <NA>                        
27 <NA>                        
28 <NA>                       +
于 2016-11-24T22:18:45.797 回答
0

根据文档readr,没有为列的子集传递多个 na 参数的实现,只有一个全局规范。我认为当需要计算效率时,这将是最突出的。read_tsv对于这些情况,进行多次调用以指定要使用 na 参数规范读取的列子集并跳过所有其他列可能是值得的。然后对具有不同 na 参数的其他列子集重复该过程,并仅读取应使用该 na 参数解析的列。最后,一个可以cbind是多个数据帧。

开发人员尚未提出此问题readr。如果您希望将其作为增强提交,请随时通过在项目的存储库中生成一个新问题来提交:Readr

于 2016-11-24T07:55:03.470 回答
0

read_tsv是的自定义实现,read_delim也是read_csvtsv专门设计用于读取制表符分隔的文件,在这种情况下也是您的测试文件。read_csv如果您不依赖于使用特定的制表符分隔实现,则可以通过使用轻松解决您的问题。

read_csv如果在列中发现很少的唯一字符集,默认情况下会将类作为因素。

将值作为因子

read.csv("test.txt", sep = "\t")  

将值作为字符获取

read.csv("test.txt", sep = "\t", stringsAsFactors = FALSE)

示例数据帧读取

编辑 1

如果您希望将特定列" "视为NA,您可以在阅读时仅使用 lappy 将类传递给那些列列表,但是根据您的问题,看起来您希望NULL被视为 NA 并且任何其他字符都应该不被胁迫。

于 2016-11-27T03:48:24.310 回答