我有一个制表符分隔的文件,如下所示:

"ID\tV1\tV2\tV3\tV4\tV5\n\t1\tA\t\t\t\t1\n\t2\tB\t\t\t\t2"

我使用以下代码读取数据:

df <- read.table("path/to/file",header=TRUE,fill=TRUE)

结果是这样的:

df
  id V1 V2 V3 V4 V5
1  1  A  1 NA NA NA
2  2  B  2 NA NA NA

但是我希望这样:

df
  id V1 V2 V3 V4 V5
1  1  A  NA NA NA 1
2  2  B  NA NA NA 2

我已经尝试过sep="\\t"na.strings=c(""," ",NULL)但是这些都无济于事。

#1楼 票数:1

我不能让它与read.table ,那么如何手动解析字符串呢?

ss <- "ID\tV1\tV2\tV3\tV4\tV5\n\t1\tA\t\t\t\t1\n\t2\tB\t\t\t\t2"

library(tidyverse)

entries <- unlist(str_split(ss, "\t"))
ncol <- str_which(entries, "\n")[1]
entries %>%
    str_remove("\\n") %>%
    matrix(ncol = ncol, byrow = T, dimnames = list(NULL, .[1:ncol])) %>%
    as.data.frame() %>%
    slice(-1) %>%
    mutate_if(is.factor, as.character) %>%
    mutate_all(parse_guess)
#  ID V1 V2 V3 V4 V5
#1  1  A NA NA NA  1
#2  2  B NA NA NA  2

说明:我们在"\\t"上分割了字符串; 第一次出现的"\\n"告诉我们我们有多少列。 然后,我们通过删除换行符"\\n"整理条目,将其重塑为matrix ,然后重塑为data.frame ,修复标题,然后让readr::parse_guess猜测每列的数据类型。

好的措施是,我们可以将所有内容汇总为一个函数

read.my.data <- function(s) {
    entries <- unlist(str_split(s, "\t"))
    ncol <- str_which(entries, "\n")[1]
    entries %>%
        str_remove("\\n") %>%
        matrix(ncol = ncol, byrow = T, dimnames = list(NULL, .[1:ncol])) %>%
        as.data.frame() %>%
        slice(-1) %>%
        mutate_if(is.factor, as.character) %>%
        mutate_all(parse_guess)
}

并确认

read.my.data(ss)
#  ID V1 V2 V3 V4 V5
#1  1  A NA NA NA  1
#2  2  B NA NA NA  2

#2楼 票数:1

data.table的fread()可以毫无问题地读取字符串...但是您的数据似乎\\t太多(在每个\\ n之后),这会导致创建额外的列。

最好在创建文件的导出中修复此问题。

如果无法做到这一点,则可以调整fread()的参数以获得所需的输出。

在这里,我们使用drop do删除由于多余的\\t而创建的第一列。
为了找回正确的列名,我们再次读取文件的第一行

string <- "ID\tV1\tV2\tV3\tV4\tV5\n\t1\tA\t\t\t\t1\n\t2\tB\t\t\t\t2"
data.table::fread( string, 
                   drop = 1, 
                   fill = TRUE, 
                   col.names = as.matrix( fread(string, nrows = 1, header = FALSE))[1,] )


   ID V1 V2 V3 V4 V5
1:  1  A NA NA NA  1
2:  2  B NA NA NA  2

#3楼 票数:1

正如Quar在他/她的评论中已经提到的那样,您的文件在每行的开头都有一个额外的标签,因此列标签的数量与数据字段的数量不匹配:

> foo <- "ID\tV1\tV2\tV3\tV4\tV5\n\t1\tA\t\t\t\t1\n\t2\tB\t\t\t\t2"
> cat(foo, "\n")
ID      V1      V2      V3      V4      V5
        1       A                               1
        2       B                               2 

如果附加的第一列包含唯一的行名,则可以。 因此,有两种方法可以解决该问题:1.删除空列(理想情况下,通过修复生成该文件的过程)或2.解决行名问题。

这是我使用第二种选择的建议:

由于数据是用制表符分隔的,因此我将使用read.delim ,它只是read table具有此类文件默认值的read table 当然,在不进行任何调整的情况下会引发错误(“不允许重复的“ row.names””)。 为了解决这个问题,我们需要告诉它使用自动行编号。 这样,您几乎可以得到所需的一切:

> read.delim(text=foo, row.names=NULL)
  row.names ID V1 V2 V3 V4 V5
1            1  A NA NA NA  1
2            2  B NA NA NA  2

剩下要做的就是摆脱row.names列。 或者,您可能希望将ID列转换为row.names:

> read.delim(text=foo, row.names='ID')
  row.names V1 V2 V3 V4 V5
1            A NA NA NA  1
2            B NA NA NA  2

希望能有所帮助。

  ask by TJ87 translate from so

未解决问题?本站智能推荐:

2回复

将空白读取为R数据表中的missing(NA)

我正在尝试创建一个函数,该函数可以找到丢失的位置并在数据表中显示丢失的位置。 现在,此函数广泛使用is.na()来查找丢失的位置,并将其替换为插补值。 对于所有类型的变量,它都可以正常工作,直到输入为character类型列并且缺少空白单元格为止,因为is.na()无法将其标识为缺少,因此跳
1回复

使用相同键索引的值填写空白字段

我有一组数据(10列,1000行),这些数据由一个或多个这些行可以共享的ID号索引。 举一个小例子来说明我的观点,考虑一下这个表: 我需要所有条目在“位置”字段中都有一些内容,并且我有一段时间尝试这样做。 注意事项: 每个唯一的ID号至少有一行,其中填充了位置字段。 如果两
2回复

如何在R中创建具有相等随机分布的数据子集

我在 R 中有以下提到的数据框: 我需要创建一个随机 3 Unique_Id 的子集,它分布在所有Date并且这三个Unique_Id必须位于可用的Status 。 所需输出 <-
1回复

如何在R中读取分隔“::”的.dat文件

我有一个带有“::”分隔符的文本文件。 当我像下面这样阅读这个文件。 有一个'sep' must be 'auto' or a single character或invalid 'sep' value: must be one byte错误消息。 我该怎么读这个文件?
1回复

在R中读取和过滤具有不同列数的.DAT文件

我有一个带有测量值的.dat文件。 其中一些数据已“损坏”。 应跳过损坏数据所在的行。 数据损坏的行的列数要么超过 6,要么低于 6。但是我只需要 6 列的行。 所以,我试图读取该文件Daten2.DAT与R中data.table 。 (见图片)有人知道我如何跳过不等于 6 列的行吗?
1回复

如何在R中的非常大的数据集中找到具有重叠间隔日期的ID的比例

到目前为止,我在这里尝试了各种答案: 组合 IRanges 对象并维护 mcols 在 R 中查找重叠开始和结束日期的所有日期范围 使用 data.table 查找重叠间隔组 在 R 的 data.table 中 foverlap 的一次迭代中查找所有重叠 按组查找时间间隔内的日期
1回复

计算R数据表中许多概率的分位数,用于多个列

如何使用data.table(内存为几GB)在大型数据集上最好地实现上述输出? 我已经尝试过了,但这不是我想要的 然后如何获得上面想要的输出,但id分布在各列中,因此它变成3 x 6的data.table。 例如,具有3行的v5%v50%v95%y5%y50%y95%列。
1回复

R:通过rbindlist+cmd读取许多压缩文件

我正在尝试通过 rbindlist 将许多压缩文件读入一个数据表中。 在旧版本的 data.table() 中,这有效,并且仍然有效,但是现在它对每个文件发出以下警告。 将 input= 作为系统命令('unzip -p ****'),并且在传递给input=的表达式中使用了一个变量。 请使用 f