这个问题是我之前提问的后续问题Importing one long line of data into R。
我有一个由单行文本组成的大型数据文件。格式类似于
Cat 14 15 Horse 16
我最终想把它变成一个data.frame。在上面的例子中,我最终会得到两个变量,两个变量,Animal和Number。每个“行”中的字符数是固定的,因此在上面的例子中,每行包含11个字符,动物是前7个,数字是接下来的4个。
所以我想要的是一个看起来像的数据框:
Animal Number
Cat 14
NA 15
Horse 16
答案 0 :(得分:2)
您可以使用read.fwf
读取文件,指定列宽和列数:
inp.fwf <- read.fwf("tmp.txt", widths = rep(c(7, 4), times = 3), as.is = TRUE)
此处,参数times = 3
适用于您的样本数据;对于您的真实文件,您必须指出有多少对,并相应地更改times
。如果你不知道你有多少条目,这可能会有效:
inp.rl <- readLines("tmp.txt")
nchar(inp.rl)/11
这将为您提供包含一行和多列的data.frame。您需要将其分成许多行和两列:
inp.mat <- matrix(inp.fwf, byrow = TRUE, ncol = 2)
这将为您的数据提供正确的形状。动物名称存储为字符向量,您可能希望将其更改为因子,但此时所有数据都在R中,因此您可以轻松调整它。
答案 1 :(得分:2)
带矢量化子串函数的解决方案。
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)))
答案 2 :(得分:1)
从你描述数据的方式不确定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
答案 3 :(得分:1)
假设您有一个带有重复动物编号对的文本文件test.dat
。
x <- scan("test.dat", what=list("", 0))
my.df <- data.frame(Animal = x[[1]], Number = x[[2]])
答案 4 :(得分:1)
Tyler对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="")))