【问题标题】:dplyr::starts_with and ends_with not subsetting based on argumentsdplyr::starts_with 和 ends_with 不是基于参数的子集
【发布时间】:2019-02-05 11:43:06
【问题描述】:

我想根据它们的名称选择一些变量来转换它们。变量名均以inq 开头,以7, 8, 10, 13:15 结尾。这对我不起作用......如果这很明显,我很抱歉,但我无法让它发挥作用。我是否使用了错误的函数,将我的函数和参数放在一起错误,或者其他什么?

一个可重现的例子:

structure(list(inq1_1 = c(NA, 7, 5, 1, 1, 6, 5, 2, NA, NA), inq1_2 = c(NA, 
7, 5, 1, 1, 6, 5, 5, NA, NA), inq1_3 = c(NA, 6, 4, 2, 1, 5, 2, 
1, NA, NA), inq1_4 = c(NA, 6, 6, 1, 1, 6, 5, 1, NA, NA), inq1_5 = c(NA, 
7, 3, 1, 1, 6, 2, 1, NA, NA), inq1_6 = c(NA, 7, 4, 4, 2, 7, 2, 
4, NA, NA), inq1_7 = c(NA, 2, 4, 6, 7, 3, 1, 7, NA, NA), inq1_8 = c(NA, 
1, NA, 2, 7, 2, 1, 4, NA, NA), inq1_9 = c(NA, 4, 6, 3, 1, 3, 
7, 1, NA, NA), inq1_10 = c(NA, 3, 5, 7, 4, 4, 2, 7, NA, NA), 
    inq1_11 = c(NA, 5, 4, 7, 1, 6, 7, 6, NA, NA), inq1_12 = c(NA, 
    7, 5, 7, 4, 6, 7, 2, NA, NA), inq1_13 = c(NA, 3, 4, 6, 4, 
    3, 4, 4, NA, NA), inq1_14 = c(NA, 3, 2, 4, 4, 2, 1, 4, NA, 
    NA), inq1_15 = c(NA, 2, 2, 3, 5, 2, 4, 4, NA, NA), inqfinal_1 = c(5, 
    NA, 3, NA, NA, NA, NA, NA, NA, NA), inqfinal_2 = c(5, NA, 
    3, NA, NA, NA, NA, NA, NA, NA), inqfinal_3 = c(6, NA, 3, 
    NA, NA, NA, NA, NA, NA, NA), inqfinal_4 = c(5, NA, 3, NA, 
    NA, NA, NA, NA, NA, NA), inqfinal_5 = c(5, NA, 3, NA, NA, 
    NA, NA, NA, NA, NA), inqfinal_6 = c(6, NA, 3, NA, NA, NA, 
    NA, NA, NA, NA), inqfinal_7 = c(4, NA, 3, NA, NA, NA, NA, 
    NA, NA, NA), inqfinal_8 = c(2, NA, 3, NA, NA, NA, NA, NA, 
    NA, NA), inqfinal_9 = c(5, NA, 3, NA, NA, NA, NA, NA, NA, 
    NA), inqfinal_10 = c(4, NA, 3, NA, NA, NA, NA, NA, NA, NA
    ), inqfinal_11 = c(6, NA, 4, NA, NA, NA, NA, NA, NA, NA), 
    inqfinal_12 = c(6, NA, 4, NA, NA, NA, NA, NA, NA, NA), inqfinal_13 = c(4, 
    NA, 3, NA, NA, NA, NA, NA, NA, NA), inqfinal_14 = c(2, NA, 
    2, NA, NA, NA, NA, NA, NA, NA), inqfinal_15 = c(2, NA, 2, 
    NA, NA, NA, NA, NA, NA, NA)), row.names = c(NA, -10L), class = c("tbl_df", 
"tbl", "data.frame"))

我正在尝试成为tidy 并按照以下代码使用dplyr

# select specific columns
sf_df %>% select(starts_with("inq"),
                 ends_with(7, 8, 10, 13:15)) %>% view(title = "test")

唉,我收到以下错误:

Error in ends_with(7, 8, 10, 13:15) : unused argument (13:15)
14. .f(.x[[i]], ...)
13. map(.x[sel], .f, ...)
12. map_if(ind_list, is_helper, eval_tidy)
11. vars_select_eval(.vars, quos)
10. tidyselect::vars_select(names(.data), !!!quos(...))
9. select.data.frame(., starts_with("inq"), ends_with(7, 8, 10, 13:15))
8. select(., starts_with("inq"), ends_with(7, 8, 10, 13:15))
7. function_list[[i]](value)
6. freduce(value, `_function_list`)
5. `_fseq`(`_lhs`)
4. eval(quote(`_fseq`(`_lhs`)), env, env)
3. eval(quote(`_fseq`(`_lhs`)), env, env)
2. withVisible(eval(quote(`_fseq`(`_lhs`)), env, env))
1. sf_df %>% select(starts_with("inq"), ends_with(7, 8, 10, 13:15)) %>% view(title = "test")

任何帮助将不胜感激!先感谢您。

干杯, 阿塔纳斯。

【问题讨论】:

    标签: r dplyr tidyverse startswith ends-with


    【解决方案1】:

    更好的选择是matches 来匹配列名中的正则表达式模式。在这里,它匹配列名开头 (^) 的模式 'ing' 和列名末尾 ($) 的数字

    sf_df %>% 
        select(matches('^inq.*(7|8|10|13|14|15)$'))
    # A tibble: 10 x 12
    #   inq1_7 inq1_8 inq1_10 inq1_13 inq1_14 inq1_15 inqfinal_7 inqfinal_8 inqfinal_10 inqfinal_13 inqfinal_14 inqfinal_15
    #    <dbl>  <dbl>   <dbl>   <dbl>   <dbl>   <dbl>      <dbl>      <dbl>       <dbl>       <dbl>       <dbl>       <dbl>
    # 1     NA     NA      NA      NA      NA      NA          4          2           4           4           2           2
    # 2      2      1       3       3       3       2         NA         NA          NA          NA          NA          NA
    # 3      4     NA       5       4       2       2          3          3           3           3           2           2
    # 4      6      2       7       6       4       3         NA         NA          NA          NA          NA          NA
    # 5      7      7       4       4       4       5         NA         NA          NA          NA          NA          NA
    # 6      3      2       4       3       2       2         NA         NA          NA          NA          NA          NA
    # 7      1      1       2       4       1       4         NA         NA          NA          NA          NA          NA
    # 8      7      4       7       4       4       4         NA         NA          NA          NA          NA          NA
    # 9     NA     NA      NA      NA      NA      NA         NA         NA          NA          NA          NA          NA
    #10     NA     NA      NA      NA      NA      NA         NA         NA          NA          NA          NA          NA
    

    请注意,如果同时使用starts_withends_with,所需的结果可能不是预期的。 OP 的数据集有 30 列,其中所有列名都以“inq”开头。因此,使用starts_with,它返回所有列,并添加ends_with,它正在检查OR 匹配,例如

    sf_df %>% 
         select(starts_with("inq"), ends_with("5")) %>%
         ncol
    #[1] 30 # returns 30 columns
    

    它不会删除字符串中与 5 不匹配的列

    这不是参数顺序的行为

    sf_df %>%
      select(ends_with("5"), starts_with("inq")) %>%
      ncol
    #[1] 30
    

    现在,如果我们只使用ends_with

    sf_df %>% 
      select(ends_with("5")) %>% 
      ncol
    #[1] 4
    

    根据示例,所有列都以“inq”开头,因此,ends_with 单独用于单个字符串 match 就足够了,正如 ?ends_with 的文档所指定的那样

    match - 一个字符串。

    而不是多个字符串

    用法在哪里

    starts_with(match, ignore.case = TRUE, vars = peek_vars())

    【讨论】:

      猜你喜欢
      • 2018-12-25
      • 1970-01-01
      • 1970-01-01
      • 2017-04-12
      • 2020-02-13
      • 2018-04-23
      • 1970-01-01
      • 2013-06-06
      • 2018-01-24
      相关资源
      最近更新 更多