我有多個相同格式的 csv 檔案需要合并,但在此之前
- 標題不是第一行而是第四行。我應該通過跳過洗掉前 3 行嗎?或者我應該重新分配標題?
- 在合并之前,我需要添加一個列,該列是檔案的 ID(與檔案名相同)。
- 然后我只需要從總共 7 列中提取 4 列。
- 總結一個類別下的數字。
- 將所有 csv 檔案合并為一個。
這就是我到目前為止所做的步驟 1、3、4,然后只添加 2 列然后添加 5,不確定我是否應該先添加 ID 列?
files = list.files(pattern = "*.csv", full.names = TRUE)
library("tidyverse")
library("dplyr")
data = data.frame()
for (file in files){
temp <- read.csv(file, skip=3, header = TRUE)
colnames(temp) <- c("Volume", "Unit", "Category", "Surpass Object", "Time", "ID")
temp <- temp [, c("Volume", "Category", "Surpass Object")]
temp <- subset(temp, Category =="Surface")
mutate(id = file)
aggregate(temp$Volume, by=list(Category=temp$Category), FUN=sum)
}
我得到了一個錯誤:
Error in is.data.frame(.data) :
argument ".data" is missing, with no default
如果我沒有放入 mutate 行,代碼很好,所以我認為主要問題來自那里,但任何建議將不勝感激。
我對 R 很陌生,非常感謝我能在這里得到的所有評論。
提前致謝!
uj5u.com熱心網友回復:
您可以使用read.csv(),但如果有很多檔案,我建議使用fread()從data.table包。它明顯更快。我fread()在這里使用過,但如果您將其切換為read.csv(). fread()也更先進。您會發現,skip有時甚至可以省略諸如此類的內容,但仍然可以正確讀取。
library(tidyverse)
library(data.table)
add_filename <- function(flnm){
fread(flnm, skip = 3) %>% # read file
mutate(id = basename(flnm)) # creates new col id w/ basename of the file
}
# single data frame all CSVs; id in first col
df <- list.files(pattern = "*.csv", full.names = TRUE) %>%
map_df(~add_filename) %>%
select(id, Volume, Category, `Surpass Object`)
我的印象是您想要聚合但也保留合并的資料框。如果是這種情況,您會將聚合與構建資料框分開。
df %>% # not assigned to a new object, so only shown in console
filter(Category == "Surface") %>% # filter for the category desired
{sum(.$Volume)} # sum the remaining values for volume
如果您不知道,最后一次呼叫中的時間段是結轉的資料,因此在本例中為過濾后的資料。解釋 {} 的最簡單方法(可能不是最好的方法)是它sum()不是為處理資料幀而設計的 - 因此對dplyr管道本身并不友好。
如果您想要每個類別的音量總和,而不僅僅是"Surface"您在問題中編碼的總和,那么您可以使用它:
df %>%
group_by(Category) %>%
summarise(sum(Volume))
請注意,我在這里使用了匯總的英式拼寫。該功能summarize()在很多包中。我剛剛發現每當我想確保它dplyr是我呼叫的函式時,對這個函式使用英式拼寫更容易。(tidyverse我認為,幾乎所有功能都接受美式和英式拼寫。)
uj5u.com熱心網友回復:
由于您似乎在嘗試使用dplyr,我將堅持該主題。
library(dplyr)
library(purrr)
files = list.files(pattern = "*.csv", full.names = TRUE)
results <- map_dfr(setNames(nm = files), ~ read.csv(.x, skip=3, header=TRUE), .id = "filename") %>%
select(filename, Category, Volume, Surpass) %>% # no idea why you want Surpass
group_by(filename, Category) %>%
summarize(Volume = sum(Volume)) # Surpass is discarded here
演練:
purrr::map_dfrread.csv(...)在每個輸入( 中的每個檔案)上迭代我們的函式 ( )files并將其行連接。由于我們用它們自己命名檔案(setNames(nm=files)類似于names(files) <- files),我們可以使用id="filename"which 添加一個“檔案名”列,該列反映了每一行是從哪個檔案中提取的。select(...)無論你說你需要什么四列。坦率地說,由于您正在聚合,我們真的只需要c("filename", "Category", "Volume"),其他任何東西,您可能在解釋中遺漏了一些東西。group_by(..)將允許我們為每個檔案名獲取一行,每個Category,其中Volume是一個總和(在下一步中計算,summarize)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/372794.html
上一篇:如何根據用戶輸入訪問資料幀行
