簡體   English   中英

在 R 中合並 function 中的數據幀

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM