我有以下文件:
[1]/tI /tam /tCharlotte
[2]/ti /tam /tcharlotte
[3]/tYou /tare /tsmart
[4]/tyou /tare /tsmart
我希望输出数据框具有以下形式:
word gloss
I i
am am
Charlotte charlotte
You you
are are
smart smart
是否可以为此编写代码?我需要通过选项卡分隔文件吗?
答案 0 :(得分:0)
你的问题并不完全清楚。例如,
忽略数字并假设奇数和偶数行不同,一个解决方案是:
##Read in the data.
tmp = read.table(textConnection("/tI /tam /tCharlotte
/ti /tam /tcharlotte
/tYou /tare /tsmart
/tyou /tare /tsmart"), sep="\n", stringsAsFactors=FALSE)
##Take the odd rows
##gsub: remove white space
##strsplit: split the string on "\t"
##unlist: go from a list to a vector
c1 = unlist(
strsplit(
gsub(" ", "", tmp[seq(1,nrow(tmp), 2),]), "/t"))
##Ditto the even rows
c2 = unlist(
strsplit(
gsub(" ", "", tmp[seq(2,nrow(tmp), 2),]), "/t"))
这为我们提供了两个可以放入数据框的向量:
dd = data.frame(c1 = c1, c2 = c2)
我认为你不想要空行,所以只需删除它们:
dd[apply(dd, 1, function(i) sum(nchar(i))>0),]
答案 1 :(得分:0)
此解决方案与@csgillespie类似,但所有操作都在一个命令中完成(一旦读取数据)。
阅读数据:
dat <- read.table(text = "/tI /tam /tCharlotte
/ti /tam /tcharlotte
/tYou /tare /tsmart
/tyou /tare /tsmart", stringsAsFactors = FALSE)
创建数据框:
structure(
as.data.frame(
lapply(
lapply(list(c(TRUE, FALSE), c(FALSE, TRUE)),
function(y) lapply(strsplit(
apply(dat, 1, "paste", collapse = ""), "/t"),
function(x) x[nchar(x) > 0])[y]),
unlist)),
.Names = c("word", "gloss"))