下面是與dplyr
包的溶液:
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")
編輯:
由於有可變長度,以每一行,這將是有意義的構建data.frame,每行中id = circleX和val =連續值。
這裏是一個簡短的功能,可以這樣做:
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
接下來,讓我們定義可以在用戶標識的線增加一個功能。 Userid基於「X.circle」文件名。
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
其餘的很簡單 - readLines列出所有文件;定義在每個文件名的用戶ID基地:
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
如果你想輸出有VAL與通過分隔值的向量「;」改變perCircle功能:
perCircle <- function(x){
tmp <- read.table(text=x)
id <- unlist(tmp[1])
id <- gsub("circle","", gsub(":", "", id))
tmp <- paste(unlist(tmp[-1]), collapse=";")
out <- data.frame(id, tmp)
names(out) <- c("id","val")
return(out)
}
## example:
perCircle(x)
id val
1 830 10788;10439;10690;10642;10551
而是寫作for循環爲什麼不使用map或lapply?請參閱https://rud.is/b/2016/07/26/use-quick-formula-functions-in-purrrmap-base-vs-tidtyverse-idiom-comparisonsexamples/ – biomiha
我認爲您的程序存在一個問題(忽略'for'循環):你寫的每一次'trains.csv'文件'i'在循環等覆蓋舊的 –
請刪除我以前的解決方案,並與您的早期循環取代。我認爲你的行爲較早前的工作,但我沒有檢查,看看你沒推斷'UserID'在循環,如用正確@wolf_wue指出。我在下面添加了一個解決方案,它應該可以工作。 –