[英]R how to remove rows in a data frame based on the first character of a column
[英]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.