2016-11-12 27 views
1

我讀過文件夾中csv文件的列表,現在我打算將它們濾除給定的閾值,其中每個data.frame中的刪除行必須以動態方式導出到所需的文件夾,而保存的行作爲輸出返回。然而,我實現了這個任務的功能,並且它工作正常,除非將丟失的行作爲csv文件寫入所需的文件夾失敗。任何人都可以指出我的功能是什麼?任何有效的方式來動態地寫入特定文件夾中的data.frame?我如何糾正實施?任何想法 ?如何動態地將過濾的數據幀導出到所需的文件夾?

重複性的數據:

myData <- list(
    df_1 = data.frame(L1=seq(3, by=4, len=16), L2=seq(7, by=4, len=16), score=sample(30, 16)), 
    df_2 = data.frame(L1=seq(6, by=7, len=20), L2=seq(14, by=7, len=20), score=sample(30, 20)), 
    df_3 = data.frame(L1=seq(11, by=8, len=25), L2=seq(19, by=8, len=25), score=sample(30, 25)) 
) 

我實現這個功能,它工作正常,除了寫不希望CSV文件:

func <- function(mlist, threshold=NULL, outDir=getwd(), .fileName=NULL, ...) { 
    if(!dir.exists(outDir)) { 
    dir.create(file.path(outDir)) 
    setwd(file.path(outDir)) 
    } 
    rslt <- lapply(mlist, function(x) { 
    .drop <- x[x$score < threshold,] 
    # FIXME : write droped rows of each data.frame into specific folder 
    write.csv(.drop, sprintf("drop.%s.csv", x), row.names = FALSE) 
    .save <- x[x$score >= threshold,] 
    return(.save) 
    }) 
    return(rslt) 
} 

這就是我打算寫在特定位置的CSV文件:與.initPath .initPath = getwd()連接,創建新文件夾並在那裏寫入csv文件。我不明白我的實施出了什麼問題,我得到了一個錯誤。

如何從每個data.frame中動態刪除行到特定文件夾?有沒有什麼快捷的方法可以更有效地實現這一點?非常感謝。

+0

什麼是您會收到錯誤?你怎麼調用這個函數? – Parfait

回答

4

當前,在您的write.csv()行中,您將數據框對象x連接到文件名sprintf()。您需要連接數據幀對象的名稱到文件名。

因此,考慮更換你的lapply()Map()函數(Map是一個包裝mapply(func, x, y, SIMPLIFY=FALSE),你傳遞兩個參數爲mlist本身和mlist名待辦事項:你可能會認爲,在原始設置中使用names(x)會工作,但此返回相應數據幀仍然將串聯到文件名的字符串失敗的列名。

func <- function(mlist, threshold=NULL, outDir=getwd(), .fileName=NULL, ...) { 
    if(!dir.exists(outDir)) { 
    dir.create(file.path(outDir)) 
    setwd(file.path(outDir)) 
    } 
    rslt <- Map(function(x, y) { 
    .drop <- x[x$score < threshold,] 

    write.csv(.drop, sprintf("drop.%s.csv", y), row.names = FALSE) 
    .save <- x[x$score >= threshold,] 
    return(.save) 
    }, mlist, names(mlist)) 
    return(rslt) 
} 

# EXAMPLE 
newData <- func(myData, threshold=10) 

而如果你想保持lapply(),創建臨時變量來捕捉df對象和df名稱。也顯示瞭如何通過將這些值到指定參數和連接所有與sprintf()允許動態路徑和文件名修改:

func <- function(mlist, threshold=NULL, csvName="", outDir=getwd(), .fileName=NULL, ...) { 
    if(!dir.exists(outDir)) { 
    dir.create(file.path(outDir)) 
    setwd(file.path(outDir)) 
    } 
    rslt <- lapply(seq_along(mlist), function(x) { 
    df <- mlist[[x]]; dfname <- names(mlist)[x] 
    .drop <- df[df$score < threshold,] 

    write.csv(.drop, sprintf("%s/%s.%s.csv", outDir, csvName, dfname), row.names = FALSE) 
    .save <- df[df$score >= threshold,] 
    return(.save) 
    }) 
    return(rslt) 
} 

# EXAMPLE 
newData <- func(myData, threshold=10, csvName=usercsv, outDir=userpath) 
+0

如果我打算讓用戶通過自定義選擇導出的csv文件的名稱,還可以自由選擇要保存文件的位置,我該怎麼做到這一點?謝謝:) – user88911

+2

在分配文件名時,請參閱編輯您將csv名稱和路徑名稱作爲參數傳遞給函數,並在'sprintf()'中連接所有函數。 – Parfait

+1

將最後一個'return'行替換爲:'return(setNames(rslt,names(mlist)))'或將'rslt'更新爲此值並返回'rslt'。 – Parfait

相關問題