我有一个文件夹,其中包含60个扩展名为.circles的文件。所有都是文本文件。
filename:239.circles
内容:
circle17: 306 281
circle16: 335 253
我想将其转换为名为train.csv的单个csv
有两列:UserId和Predicted
在UserId的行中,我应该得到文件名,例如:239,并且在Predicted的行中我应该得到圆圈中的值;例如:306 281; 335 253
感谢@Adam这是我到目前为止所做的
setwd("D:/r/social/Expt/Training")
files <- list.files(pattern = "*.circles")
readFn <- function(i) {
f <- readLines(i,n=-1,con)
f <-sub("^[^:]*","",f)
f <- paste(f, collapse=';')
return(f)
}
all.files <- lapply(files, readFn)
output <- do.call(rbind, all.files)
write.csv(output,"train.csv")
我现在得到的输出是
1:306 281; :335 253
我希望它为239 306 281; 335 253在第1列下我应该得到239(因为我正在读取文件239.circles)而在第2列下我应该得到:306 281; :335 253(无额外:之后;)
答案 0 :(得分:0)
以下是"
包的解决方案:
dplyr
编辑:
由于每行都有可变长度,因此为每行构建一个data.frame是有意义的,其中id = circleX和val =每行中的连续值。
这是一个简短的功能:
all_files <- lapply(files, readLines)
all_dat <- lapply(all_files, function(x)read.table(text=x)[2:3])
userid <- gsub(".circles", "", files) #this step extract the UserID based the "X.circle" file names
all_dat <- lapply(1:length(all_dat), function(x) all_dat[[x]] %>% mutate(UserId = userid[x]))
output <- do.call(rbind, all_dat)
write.csv(output,"trains.csv")
接下来,让我们定义一个可以在用户ID中添加到该行的函数。 Userid基于“X.circle”文件名。
perCircle <- function(x){
tmp <- read.table(text=x)
id <- unlist(tmp[1])
id <- gsub("circle","", gsub(":", "", id))
out <- data.frame(id, t(tmp)[-1])
names(out) <- c("id","val")
return(out)
}
## example for how perCircle works:
x <- "circle830: 10788 10439 10690 10642 10551"
perCircle(x)
id val
1 830 10788
2 830 10439
3 830 10690
4 830 10642
5 830 10551
其余的非常简单 - readLines所有文件作为列表;在每个文件名上定义用户标识:
addUser <- function(x, id){
out <- perCircle(x)
data.frame(Userid=id, out)
}
# example: the defined x above is taken from "10395.circles" line 7
addUser(x, "10395")
Userid id val
1 10395 830 10788
2 10395 830 10439
3 10395 830 10690
4 10395 830 10642
5 10395 830 10551
如果您希望输出将val作为矢量,其值由“;”分隔,请将perCircle函数更改为:
files <- list.files("./Training", pattern=".circle", full=T)
all_files <- lapply(files, readLines)
userid <- gsub(".circles", "", list.files("./Training", pattern=".circle"))
output <- ldply(1:length(all_files), function(x)
ldply(all_files[[x]], addUser, id=userid[x]))
write.csv(output,"trains.csv")
output[c(100,500,1000, 1500), ] # example of 4 lines within the long data.frame
Userid id val
100 10395 377 10424
500 10929 839 10984
1000 11186 989 15007
1500 12800 62 13256