将带有空格的一长行数据导入R

将带有空格的一长行数据导入R,r,R,这个问题是我上一个问题的后续问题 我有一个由一行文本组成的大数据文件。格式类似于 Cat 14 15 Horse 16 我最终想把它放到一个data.frame中。在上面的例子中,我将得到两个变量,两个变量,动物和数字。每个“行”中的字符数是固定的,因此在上面的示例中,每行包含11个字符,动物是前7个,数字是后4个 所以我想要的是一个数据框,看起来像: Animal Number Cat 14 NA 15 Horse 16 从

这个问题是我上一个问题的后续问题

我有一个由一行文本组成的大数据文件。格式类似于

Cat    14         15  Horse  16
我最终想把它放到一个data.frame中。在上面的例子中,我将得到两个变量,两个变量,动物和数字。每个“行”中的字符数是固定的,因此在上面的示例中,每行包含11个字符,动物是前7个,数字是后4个

所以我想要的是一个数据框,看起来像:

Animal Number
   Cat     14
    NA     15
 Horse     16

从你描述数据的方式来看,不确定15是关于什么的,应该是动物空间计数空间动物

无论如何,如果15个不应该存在,这里有一个方法

list1<-"Cat 14 Horse 16" 

x <- unlist(strsplit(list1, " "))
            x <- as.data.frame(matrix(x, length(x)/2, 2, byrow = TRUE))
            x[, 2] <- as.numeric(as.character(x[, 2]))
            x[, 1] <- as.character(x[, 1])
names(x) <-c('animal', 'count')   
x

list1假设您有一个文本文件,
test.dat
,其中包含重复的动物编号对

x <- scan("test.dat", what=list("", 0))
my.df <- data.frame(Animal = x[[1]], Number = x[[2]])

x您可以使用
read.fwf
读取文件,指定列宽和列数:

inp.fwf <- read.fwf("tmp.txt", widths = rep(c(7, 4), times = 3), as.is = TRUE)
这将为您提供一个包含一行和多列的data.frame。您需要将其分成许多行和两列:

inp.mat <- matrix(inp.fwf, byrow = TRUE, ncol = 2)

inp.matTyler使用的
read.fwf
可能更干净,但这里有另一种可能的方法

x <- readLines(textConnection("Cat    14         15  Horse  16  "))
x <- matrix(strsplit(x, "")[[1]], nrow=11)
d <- data.frame(Animal = apply(x[1:7,], 2, paste, collapse=""),
                Number = as.numeric(apply(x[8:11,], 2, paste, collapse="")))

x具有向量化子串函数的解决方案

x <- readLines(textConnection("Cat    14         15  Horse  16  "))
idx <- seq.int(1,nchar(x),by=11)
vsubstr <- Vectorize(substr,vectorize.args=c("start","stop"))
dat <- data.frame(Animal= vsubstr(x,idx,idx+6),
                  Number= as.numeric(vsubstr(x,idx+7,idx+10)))

我不明白你的意思。你是说这是一个固定宽度的文件吗?每只动物有7个字符,每个数字有4个字符?你为什么重复这个问题?我刚才看到了。我不明白有什么不同?+1用于编辑问题,以便清楚地了解您的问题。谢谢你的及时修改。@Tyler-这个例子中的一只动物已经逃出了游戏围栏,所以再也找不到了。+1做得很好。我曾想过使用substr,但我尝试的代码感觉很难看;你使用矢量化使它看起来很漂亮。
x <- readLines(textConnection("Cat    14         15  Horse  16  "))
idx <- seq.int(1,nchar(x),by=11)
vsubstr <- Vectorize(substr,vectorize.args=c("start","stop"))
dat <- data.frame(Animal= vsubstr(x,idx,idx+6),
                  Number= as.numeric(vsubstr(x,idx+7,idx+10)))