簡體   English   中英

R:根據文件名列從數據框中刪除行

[英]R: Remove rows from data frame based on file name column

我有一個大的csv文件,我正在讀取一個數據幀,它本身就是csv的組合。 數據框中的第一列是文件名。 文件名始終以5位數字和“ .csv”結尾。每個文件名的出現次數會有所不同。 例如:

Source File
xxx_00001.csv
xxx_00001.csv
xxx_00001.csv
xxx_00001.csv
xxx_00001.csv
xxx_00002.csv
xxx_00002.csv
xxx_00002.csv
xxx_00002.csv
xxx_00003.csv
xxx_00003.csv
xxx_00003.csv
xxx_00003.csv
xxx_00003.csv
xxx_00003.csv
...

我將如何刪除與文件名的最后n次出現相關的行? (例如,最后2個?)我想說的是:

Source File
xxx_00001.csv
xxx_00001.csv
xxx_00001.csv
xxx_00002.csv
xxx_00002.csv
xxx_00003.csv
xxx_00003.csv
xxx_00003.csv
xxx_00003.csv
...

使用dplyr

 library(dplyr)
 n_to_remove <- 2
 filtered <- group_by(df, SourceFile) %>% slice(1:(n()-n_to_remove))

group_by將確保對每個組分別進行切片操作。 n()也是dplyr的函數,它將返回組內的行數。 請注意,如果其中一個CSV的行數小於n_to_remove ,則此操作將失敗。

我們可以從base R使用ave

n <- 2
df1[with(df1, !ave(seq_along(Source_File), Source_File, 
             FUN = function(x) x %in% tail(x,n))), , drop=FALSE]
#     Source_File
#1  xxx_00001.csv
#2  xxx_00001.csv
#3  xxx_00001.csv
#6  xxx_00002.csv
#7  xxx_00002.csv
#10 xxx_00003.csv
#11 xxx_00003.csv
#12 xxx_00003.csv
#13 xxx_00003.csv

或與data.table

library(data.table)
setDT(df1, keep.rownames=TRUE)[, head(.SD, -n) ,.(Source_File)][, rn:=NULL][]
#     Source_File
#1: xxx_00001.csv
#2: xxx_00001.csv
#3: xxx_00001.csv
#4: xxx_00002.csv
#5: xxx_00002.csv
#6: xxx_00003.csv
#7: xxx_00003.csv
#8: xxx_00003.csv
#9: xxx_00003.csv

數據

df1 <- structure(list(Source_File = c("xxx_00001.csv", "xxx_00001.csv", 
"xxx_00001.csv", "xxx_00001.csv", "xxx_00001.csv", "xxx_00002.csv", 
"xxx_00002.csv", "xxx_00002.csv", "xxx_00002.csv", "xxx_00003.csv", 
"xxx_00003.csv", "xxx_00003.csv", "xxx_00003.csv", "xxx_00003.csv", 
"xxx_00003.csv")), .Names = "Source_File", class = "data.frame", 
row.names = c(NA, -15L))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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