0

总结:你可以做rename(A=1, B=2),你能用rename_with()做同样的事情吗?我的 ~str_replace(... paste0()) 有效,我不需要改变它。但它一次只适用于一个变量。Tidyselect 建议包装 where(~str_replace...) 但随后抱怨它找不到它,即使我可以让 where() 在其他情况下工作。

我想为多个变量实现 rename_with,但我得到一个错误Error: Formula shorthand must be wrapped in where()`。

# Bad
  data %>% select(~str_replace(., "Var_2_", paste0("Issue: Time")))

  # Good
  data %>% select(where(~str_replace(., "Var_2_", paste0("Issue: time"))))

示例原文: test%>% rename_with( ~str_replace(., "Var_2_", paste0("Issue: Time")), ~str_replace(., "Var_3_", paste0("Issue: Time")))

当我跑步时 test%>% rename_with(where( ~str_replace(., "Var_2_", paste0("Issue: Time")), ~str_replace(., "Var_3_", paste0("Issue: Time"))))

test%>% rename_with( where(~str_replace(., "Var_2_", paste0("Issue: Time"))), where(~str_replace(., "Var_3_", paste0("Issue: Time"))))

我明白 Error in where(~str_replace(., "Var_1_", paste0("Gov't surveillance: video wave")), : could not find function "where" 了,我找不到它通过tidyselect::

但我可以 test%>% select(where(is.numeric)) %>% map(sd, na.rm = TRUE) 毫无问题地运行,所以它确实存在。我究竟做错了什么?

示例数据:

x <- c("_1_1",
       "_1_2",
       "_1_3",
       "_2_1",
       "_2_2",
       "_2_3",
       "_3_1",
       "_3_2",
       "_3_3",
       "_4_3")
paste0("Var",x)

test <- t(as_tibble(rnorm(10, 5.5, .35)))
colnames(test) <- paste0("Var",x)
4

1 回答 1

0

rename_with与 相比,有一个参数切换rename_at。代码中指定的列名有点不清楚,尤其是str_replace在两个参数中显示的数据。用 'Issue: Time_2' 替换以 'Var_2' 开头的列名的典型用法是

library(dplyr)
data <- data %>% 
    rename_with(~ str_replace(., 'Var_2', 'Issue: Time'), 
       starts_with('Var_2'))

-输出

data
# A tibble: 1 x 10
#  Var_1_1 Var_1_2 Var_1_3 `Issue: Time_1` `Issue: Time_2` `Issue: Time_3` Var_3_1 Var_3_2 Var_3_3 Var_4_3
#    <dbl>   <dbl>   <dbl>           <dbl>           <dbl>           <dbl>   <dbl>   <dbl>   <dbl>   <dbl>
#1    5.68    5.18    5.34            5.38            5.47            5.82    5.93    5.35    5.20    5.62   

如果我们需要更改多个列模式,请使用matches

data %>% 
   rename_with(~ str_replace(., '(Var_2|Var_3)', '\\1_Issue: Time'),
         matches('Var_2|Var_3'))
# A tibble: 1 x 10
#  Var_1_1 Var_1_2 Var_1_3 `Var_2_Issue: Tim… `Var_2_Issue: Tim… `Var_2_Issue: Tim… `Var_3_Issue: Ti… `Var_3_Issue: Ti… `Var_3_Issue: Ti… Var_4_3
#    <dbl>   <dbl>   <dbl>              <dbl>              <dbl>              <dbl>             <dbl>             <dbl>             <dbl>   <dbl>
#1    5.68    5.18    5.34               5.38               5.47               5.82              5.93              5.35              5.20    5.62
 

或者如果我们想改变相应的替换,模式,使用str_replace_all

data1 <- data %>%
   set_names(str_replace_all(names(.), c("Var_1", "Var_2"), c("Issue 1 wave", "Issue 2 Wave")))

比较输出

data1
# A tibble: 1 x 10
  `Issue 1 wave_1` Var_1_2 `Issue 1 wave_3` `Trust Wave_1` Var_2_2 `Issue 2  Wave_3` Var_3_1 Var_3_2 Var_3_3 Var_4_3
                          <dbl>   <dbl>                         <dbl>          <dbl>   <dbl>          <dbl>   <dbl>   <dbl>   <dbl>   <dbl>
1                          5.68    5.18                          5.34           5.38    5.47           5.82    5.93    5.35    5.20    5.62

有原始数据

data
# A tibble: 1 x 10
  Var_1_1 Var_1_2 Var_1_3 Var_2_1 Var_2_2 Var_2_3 Var_3_1 Var_3_2 Var_3_3 Var_4_3
    <dbl>   <dbl>   <dbl>   <dbl>   <dbl>   <dbl>   <dbl>   <dbl>   <dbl>   <dbl>
1    5.68    5.18    5.34    5.38    5.47    5.82    5.93    5.35    5.20    5.62

where通常用于检查列值,即假设我们要选择数字类型的列,使用select(where(is.numeric))而不是列名。有 select_helpers 可以根据子字符串(即starts_with, ends_with, )查找列名contains,或将正则表达式模式传入 matches. 的一个用例where

data %>% 
   rename_with(~ str_replace(., 'Var_2', 'Issue: Time'), where(~ all(. > 5.5)))

# A tibble: 1 x 10
#  Var_1_1 Var_1_2 Var_1_3 Var_2_1 Var_2_2 `Issue: Time_3` Var_3_1 Var_3_2 Var_3_3 Var_4_3
#    <dbl>   <dbl>   <dbl>   <dbl>   <dbl>           <dbl>   <dbl>   <dbl>   <dbl>   <dbl>
#1    5.68    5.18    5.34    5.38    5.47            5.82    5.93    5.35    5.20    5.62

在 OP 的代码中,select/map可以替换为summarise/across

df %>%
    summarise(across(where(is.numeric), sd))

数据

data <- as_tibble(test)
于 2021-02-22T22:32:13.250 回答