[英]merge dataframes in a function in R
我有以下文件夾結構,
-test1
-test2
-test3
-test4
-test5
在這些文件夾中有.tsv 文件,我可以通過 function 打開我寫道:
process <- function(f){
df <- read.csv(f, sep = "\t", header = F)
colnames(df) <- c("1","2","3","4","5","6","7","8","9")
df <- df[-c(1, 2, 3, 4, 5, 6),]
df <- df[c("1", "7")]
df <- merge(df, df, by="1")
print(df)
}
files <- dir("path", recursive = T, full.names = T, pattern = "*.tsv")
sapply(files, process)
這會打印我需要的數據幀,但我想要做的是自動將數據幀合並為一個,在第 1 列合並,但上面的代碼沒有按我的意願執行,我收到以下錯誤: as.data.frame 中的錯誤( y): 缺少參數“y”,沒有默認值
這是一個解決方案。 未經測試,因為沒有數據。
process <- function(f){
df <- read.delim(f, header = FALSE)
colnames(df) <- c("1","2","3","4","5","6","7","8","9")
df <- df[-c(1, 2, 3, 4, 5, 6),]
df[c("1", "7")]
}
files <- dir("path", recursive = T, full.names = T, pattern = "\\.tsv$")
df_list <- lapply(files, process)
將文件讀入df_list
后,以下將按列"1"
合並(加入)它們,結果更寬。
df_final <- Reduce(\(x, y) merge(x, y, by = "1"), df_list)
names(df_final)[-1] <- sprintf("Var%03d", seq_along(names(df_final)[-1]))
相反,如果您想按行綁定文件,則使用更長的結果
df_final <- do.call(rbind, df_list)
或者,要知道數據來自哪些文件,請將它們的名稱包含在一個新列中。
df_list2 <- lapply(seq_along(files), \(i) {
cbind(data.frame(file = files[i]), df_list[[i]])
})
df_final_long <- do.call(rbind, df_list2)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.