我正試圖加載一系列CSV檔案,然后為CSV中的每一列添加一個后綴(除了主鍵(subject_id))。每個CSV檔案看起來是這樣的
想象一下,這個 csv 檔案的標題是 data1,隨后的檔案標題是 data2、data3...等等。
對于我加載的每個csv檔案,我想把表格轉換成類似于
的東西。| subject_id | var1_data2 | var2_data2|
|---|---|---|
| 1 | 55 | 55 | 57 |
| 2 | 55 | 57 |
我知道如何加載資料集;
我知道如何加載資料集。
filenames <- list. files(path= "data", full。 names = TRUE)。
datasets <- lapply(filenames, read_csv)
但是,我正在苦苦思索如何寫一個回圈/應用陳述句,以我想要的方式添加后綴。
下面的函式,將添加一個后綴,但它是靜態的。
lapply(datasets。 function(df) {
names(df)[-1] < - paste0(names(df)[-1]/span>。 "_data1")
df
})
接下來我嘗試在上面的函式中間夾入一個for回圈
filenames2 <- sub('. csv$', '', list. files(path = "data"))
lapply(dataset3。 function(df) {>
for (val in filenames2){>
names(df)[-1] < - paste0(names(df)[-1]/span>。 val)
df
}
})
但是這只是把所有東西都變成了NULL/不作業。有沒有人認為什么是最好的方法?我也愿意接受python中的解決方案,但R將是首選。
謝謝你!
uj5u.com熱心網友回復:
如果每個資料集都有相同的列,另一種方法是做一個單一的data.frame,其中一列是資料集的原點,這里有一種方法可以做到。
datasets <-
purrr::map_df()
.x = filenames,.
.f = read_csv,.
.id = "dataset"/span>
)
uj5u.com熱心網友回復:
假設我們在最后的注解里有可重復生成的檔案。
然后我們在fnames中得到檔案名,Map一個函式Read在它們上面讀取每個檔案并固定名稱,回傳固定的資料框架。
fnames <- Sys.glob("data*.csv")
閱讀 <- function(f) {>
df <- read.csv(f)
names(df)[-1] < - paste0(names(df[/span>-1])。 "_", sub(" 。 csv$", "。 basename(f)))
df
}
L <- Map(Read, fnames)
str(L)
給這個命名的串列:
List of 3
$ data1.csv:'data. frame': 2obs.of 3 variables:.
.. $ subject_id: int [1。 2] 1 2
.. $ var1_data1: int [1。 2] 55 55
.. $ var2_data1: int [1。 2]/span> 57 57
$ data2.csv:'data. frame': 2obs.of 3 variables:.
.. $ subject_id: int [1。 2] 1 2
.. $ var1_data2: int [1。 2] 55 55
.. $ var2_data2: int [1。 2] 57 57
$ data3.csv:'data. frame': 2obs.of 3 variables:.
.. $ subject_id: int [1。 2] 1 2
.. $ var1_data3: int [1。 2] 55 55
.. $ var2_data3: int [1。 2]/span> 57 57
注
Lines <- "subject_id var1 var2
1 55 57
2 55 57"
data1 <- data2 <- data3 <- read. table(text = Lines。 頭= TRUE)
for(f in c("data1"/span>。 "data2", "data3")>寫。 csv(get(f)。 paste0(f, " 。 csv"),行。 names = FALSE。 quote = FALSE)
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/310229.html
標籤:
