使用函数从数据框中过滤或选择行的正确语法。

3
我正在尝试筛选或子集化数据框,以便仅包括内容以特定字母开头的列的行。
我已经尝试使用subsetfilterselect(包括dplyr中的starts_with),但似乎找不到实现所需功能的正确语法。我找到的所有示例都演示了根据值(例如x>1)进行过滤,而不是通过函数进行过滤。我只成功创建了各种各样的错误消息。

参考文献: https://www.rdocumentation.org/packages/dplyr/versions/0.7.8/topics/select|选择特定列 https://www.rdocumentation.org/packages/dplyr/versions/0.7.8/topics/filter_all|基于逻辑条件过滤数据 https://www.rdocumentation.org/packages/tidyselect/versions/0.1.1/topics/select_helpers|选择辅助函数 https://www.rdocumentation.org/packages/base/versions/3.5.1/topics/startsWith|检查字符串是否以指定字符开头 Filter data.frame rows by a logical condition|基于逻辑条件过滤数据框的行

library(tidyverse)
a <- c("A1435","A6732","A8841","B7623","B7714","B3154")
b <- c("place 1", "place 2", "place 3", "place 4", "place 5", "place 6")
test_frame <- data.frame(a,b)

这是我尝试过的一些事情:

subset <- subset(test_frame, subset = startsWith(test_frame$a, "A"))
## Error in startsWith(test_frame$a, "A") : non-character object(s)

subset <- subset(test_frame, subset = startsWith(test_frame[,1], "A") == 1)
## Error in startsWith(test_frame[, 1], "A") : non-character object(s)

subset <- test_frame %>% dplyr::select(test_frame, starts_with("A", ignore.case = TRUE, vars = a))
## Error: `test_frame` must evaluate to column positions or names, not a list

subset <- dplyr::select(test_frame, starts_with("A", ignore.case = TRUE, vars = a))
## Error in inds_combine(.vars, ind_list) : Position must be between 0 and n

subset <- test_frame %>% dplyr::filter_if(test_frame$a, ~ starts_with("A"))
## Error: Can't convert a `factor` object to function

subset <- vars_select(test_frame, starts_with("A"))
## Error: `vars` must be a character vector

subset <- dplyr::filter(test_frame, dplyr::starts_with("A"), all_vars(. == a))
## Error: No tidyselect variables were registered

subset <- test_frame$a %>% grep("^A", .)
## [1] 1 2 3

这最后一次尝试至少没有给我报错,但也没有帮助我创建数据框的子集。我能否将此grep与上述函数之一结合使用,以获得我的结果呢?
我曾认为这个任务会很容易,但我已经花了整整一天的时间,却没有成功。那么,我错过了什么吗?
*编辑:太神奇了-发布几分钟后就收到了几个非常有帮助的回复。谢谢大家,谢谢Stack Overflow!*

创建数据框时,使用 setStringsAsFactors = TRUE - boski
2
在基本的R语言中,可以使用以下代码进行数据筛选:test_frame <- data.frame(a,b,stringsAsFactors=FALSE); subset(test_frame, startsWith(a, "A")),无需使用'verse syntax。 - Frank
3个回答

4
我们可以使用select_if根据条件选择列。
test_frame %>% 
    select_if( ~ any(str_detect(.x, "A")))

或者用于筛选行

test_frame %>% 
     filter_all(any_vars(str_detect(., "A")))
#      a       b
#1 A1435 place 1
#2 A6732 place 2
#3 A8841 place 3

或者使用一部分列

test_frame %>%
     filter_at(vars(starts_with("a")), any_vars(str_detect(., "A")))

或者使用基本R
i1 <- Reduce(`|`, lapply(test_frame[startsWith(names(test_frame), "a")],
            grepl, pattern ="^A"))
test_frame[i1,]

3

你可以使用 grepl 函数。

 test_frame[grepl("^A", test_frame$a), ]
      a       b
1 A1435 place 1
2 A6732 place 2
3 A8841 place 3

2

为了多样化而添加的一种效率较低的解决方案:

 test_frame[startsWith(as.character(test_frame$a),"A"),]


   #    a       b
   # 1 A1435 place 1
   # 2 A6732 place 2
   # 3 A8841 place 3

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接