我想筛选一个列不像列表中任何值的数据集。
我试过不同的方法,但它们不起作用
month <- c("2022-02", "2022-02", "2022-03", "2022-03", "2022-05","2022-06", "2022-07","2022-02", "2022-04","2022-5","2022-6","2022-7")
total_amount <- c(100, 200, 500, 600, 700, 300, 500, 900, 900, 600, 500, 700)
merchant_name <- c("fpay", "gpay", "upay", "zpay","tpay","spay","mpay", "dpay", "bpay", "opay", "npay", "ypay")
df <- data.frame(month, total_amount, merchant_name)a <- c("fpay", "gpay", "upay", "zpay","tpay","spay","mpay")
df1 = df %>% list.filter(!merchant_name %like% a)或
df1 = subset(df, !merchant_name%like% a)或
df1 <- df[apply(df,1,function(x) sum(!x %like% a)>=1),]然而,df1的观测数与df相同,一点也不滤波。我收到一条警告信息:
在grepl中(模式,向量,ignore.case = ignore.case,固定):参数'pattern‘的长度>1,并且只使用第一个元素
请帮帮我。非常感谢
发布于 2022-09-23 16:04:28
如果这些是子字符串,则在使用grepl对'a‘中的元素进行paste之后使用collapse = "|"
subset(df, grepl(paste(a, collapse = "|"), merchant_name))或者使用%like%
subset(df, Reduce(`|`, lapply(a, \(x) merchant_name %like% x)))发布于 2022-09-23 20:41:53
只需做:
df[! df$merchant_name %in% a, ]为了理解这段代码,让我们从内到外工作。
首先,表达式df$merchant_name %in% a。这将创建一个逻辑向量( TRUE或FALSE值的向量),并为df$merchant_name中的每个元素(因此也包括df中的每一行)创建一个条目。如果每一行的条目在a和FALSE中,则对应的条目是NA(从技术上讲,如果条目本身是NA,则会有特殊情况)。
然后,! df$merchant_name %in% a否定前面的表达式。这与我们查找那些不与列表匹配的行的意图相匹配。
最后,我们可以使用前面的表达式来子集/过滤所需条目的df。为此,我们将使用前面的表达式作为行位置的索引向量(例如,在df[i, j]中,i是行位置的索引向量,j是列位置的索引向量)。带我们走一圈:
df[! df$merchant_name %in% a, ]https://stackoverflow.com/questions/73828228
复制相似问题