我正在参加在线培训正则表达式课程。问题是
使用正则表达式,您可以计算匹配的数量。你能让它返回给定字符串中大写辅音(B、C、D、F、..、X、Y、Z)的数量吗?例如:它应该返回 3 和文本 ABcDeFO!。注意:仅 ASCII。我们认为 Y 是一个辅音!示例:正则表达式 /./g 在针对字符串 abc 运行时将返回 3。`
我的解决方案是/[BCDFGHJKLMNPQRSTVWXYZ]/g(26个字符长)
我的另一个解决方案是/(?![AEIOU])[A-Z]/g这19个字元。但根据网上统计,最短的解决方案是16个字符长。任何想法如何做到这一点?

这个问题虽然有三个答案,但在我思考这个问题时却引起了我的怀疑。虽然我知道问题可以通过其他方法解决(特别是使用 purrr 或应用函数组),但我不确定它实际上可以通过吗mutate(across(...?为了清楚起见,我在这里重现这个问题。注意:我不是在寻找它的答案,而是只是对我的疑问的答案是否两组变量实际上可以通过 mutate/across 传递
有两组变量(一组没有后缀,一组有后缀avail)。
df <- tibble(a = c(0, 1, 0, 0, 0),
       a_avail = c(1, 1, 1, 0, 0),
       b = c(1, 1, 1, 0, 0),
       b_avail = c(1, 0, 0, 1, 0))
# A tibble: 5 x 4
      a a_avail     b b_avail
  <dbl>   <dbl> <dbl>   <dbl>
1     0       1     1       1
2     1       1     1       0
3     0       1     1       0
4     0       0     0       1
5     0       0     0       0 …虽然我试图搜索它是否重复,但我找不到类似的问题。(虽然有类似的,但和我的要求有些不同)
我的问题是,我们是否可以使用字符串操作函数,substr例如. 作为一个可重现的例子,考虑这个stringr::str_remove.namesdplyr::across
library(dplyr)
iris %>%
  summarise(across(starts_with('Sepal'), mean, .names = '{.col}_mean'))
  Sepal.Length_mean Sepal.Width_mean
1          5.843333         3.057333
现在我的问题是我想重命名输出列,str_remove(.col, 'Sepal')以便我的输出列名称只是Length.mean和Width.mean。我为什么问这个问题,因为这个论点的描述表明
.names
描述如何命名输出列的粘合规范。这可以使用 {.col} 代表选定的列名称,并使用 {.fn} 代表正在应用的函数的名称。默认值 (NULL) 相当于单函数情况下的“{.col}”,以及列表用于 .fns 的情况下的“{.col}_{.fn}”。
我尝试了很多可能性,包括以下内容,但这些都不起作用
library(tidyverse)
library(glue)
iris %>%
  summarise(across(starts_with('Sepal'), mean, 
                   .names = glue('{xx}_mean', xx = str_remove(.col, 'Sepal'))))
Error: Problem with `summarise()` input `..1`.
x argument `str` should be a character vector (or an object coercible to)
i Input `..1` is …我有一个 dataframe ,其中一列包含冒号和等号分隔的字符串。
data$col1
  [1] "ECNT=2;HCNT=4;MAX_ED=51;MIN_ED=51;NLOD=38.78;TLOD=5.45"  
  [2] "ECNT=2;HCNT=8;MAX_ED=51;MIN_ED=51;NLOD=36.58;TLOD=4.05"  
  [3] "DB;ECNT=1;HCNT=16;MAX_ED=.;MIN_ED=.;NLOD=20.42;TLOD=5.82"
  [4] "DB;ECNT=1;HCNT=4;MAX_ED=.;MIN_ED=.;NLOD=30.70;TLOD=8.03" 
  [5] "ECNT=2;HCNT=6;MAX_ED=7;MIN_ED=7;NLOD=41.48;TLOD=5.37"    
  [6] "ECNT=2;HCNT=9;MAX_ED=7;MIN_ED=7;NLOD=40.59;TLOD=5.29" 
我想提取NLOD=和后面的数字TLOD=,然后将其分成两列。这是我想要的输出。
data
                                                        col1     TLOD      NLOD
    "ECNT=2;HCNT=4;MAX_ED=51;MIN_ED=51;NLOD=38.78;TLOD=5.45"     5.45     38.78
    "ECNT=2;HCNT=8;MAX_ED=51;MIN_ED=51;NLOD=36.58;TLOD=4.05"     4.05     36.58
  "DB;ECNT=1;HCNT=16;MAX_ED=.;MIN_ED=.;NLOD=20.42;TLOD=5.82"     5.82     20.42
   "DB;ECNT=1;HCNT=4;MAX_ED=.;MIN_ED=.;NLOD=30.70;TLOD=8.03"     8.03     30.70
      "ECNT=2;HCNT=6;MAX_ED=7;MIN_ED=7;NLOD=41.48;TLOD=5.37"     5.37     41.48
      "ECNT=2;HCNT=9;MAX_ED=7;MIN_ED=7;NLOD=40.59;TLOD=5.29"     5.29     40.59
任何帮助表示赞赏。谢谢你。
可重现的样本数据
structure(list(col1 = c("ECNT=2;HCNT=4;MAX_ED=51;MIN_ED=51;NLOD=38.78;TLOD=5.45", 
"ECNT=2;HCNT=8;MAX_ED=51;MIN_ED=51;NLOD=36.58;TLOD=4.05", "DB;ECNT=1;HCNT=16;MAX_ED=.;MIN_ED=.;NLOD=20.42;TLOD=5.82", 
"DB;ECNT=1;HCNT=4;MAX_ED=.;MIN_ED=.;NLOD=30.70;TLOD=8.03", "ECNT=2;HCNT=6;MAX_ED=7;MIN_ED=7;NLOD=41.48;TLOD=5.37", 
"ECNT=2;HCNT=9;MAX_ED=7;MIN_ED=7;NLOD=40.59;TLOD=5.29")), row.names = c(NA, 
-6L), class = c("tbl_df", "tbl", "data.frame"))
让我澄清一下,我在这里不是在查看语法mutate_at或mutate(across(..., ...))类型。我只想知道如何在 tidyverse 管道语法中一次创建多个新列。
让我们假设数据集的情况iris。
我想创建 10 个(或 100 个或更多)具有这样的标准的新列。
V1是Petal.Length * 1,V2的是Petal.Length * 2V10 Petal.Length * 10无需明确编写每个列的名称和公式,如果我想创建 100 个新列,这可能会很麻烦。
I am trying to provide two functions inside the mutate(across(where(is.factor))) to order the factor levels and drop unused levels. The code appears not to be working as expected. Where might have gone wrong?
#---- Libraries ----
library(tidyverse)
#---- Data ----
set.seed(2021)
df <- tibble(
  a1 = factor(ifelse(sign(rnorm(30))==-1, 0, 1), labels = c("No", "Yes")),
  a2 = factor(ifelse(sign(rnorm(30))==-1, 0, 1), labels = c("No", "Yes")),
  gender = gl(2, 15, labels = c("Males", "Females")),
  b2 = gl(3, 10, labels = c("Primary", "Secondary", "Tertiary", "Unknown")), …我有一个看起来像虹膜数据集的数据集。
  Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1          5.1         3.5          1.4         0.2  setosa
2          4.9         3.0          1.4         0.2  setosa
3          4.7         3.2          1.3         0.2  setosa
4          4.6         3.1          1.5         0.2  setosa
5          5.0         3.6          1.4         0.2  setosa
6          5.4         3.9          1.7         0.4  setosa
我想跨越 Sepal.Length:Petal.Width 用数字2减去每个值,然后将结果除以4。如何在 dplyr 中使用 mutate_across 而不是两行在一行中执行此操作?
iris %>% 
  mutate(across(c(Sepal.Length:Petal.Width), ~. -2 )) %>% 
  mutate(across(c(Sepal.Length:Petal.Width), ~. /4 ))