从文件中读取数据并粘贴到R中的csv中

时间:2017-05-05 07:24:03

标签: r

我有一个文件夹,其中包含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(无额外:之后;)

1 个答案:

答案 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
相关问题