Loading [MathJax]/jax/input/TeX/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >tidyselect:: where ()不一致:where is where()?

tidyselect:: where ()不一致:where is where()?
EN

Stack Overflow用户
提问于 2021-02-22 22:29:22
回答 1查看 126关注 0票数 0

摘要:你可以重命名(A=1,B=2),你能用rename_with()做同样的事情吗?我的~str_replace(...Paste0()可以工作,我不需要更改它。但它一次只对一个变量有效。Tidyselect建议换行where(~str_replace...)但随后抱怨说,即使我可以在其他实例中使用where(),它也找不到它。

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 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),所以它确实存在。我做错了什么?

示例数据:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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)
EN

回答 1

Stack Overflow用户

发布于 2021-02-22 22:32:13

rename_at相比,rename_with中的参数发生了切换。关于代码中指定的列名和显示的数据有一点不清楚,特别是在两个参数中都有str_replace的情况下。将以'Var_2‘开头的列名替换为'Issue: Time_2’的典型用法是

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
library(dplyr)
data <- data %>% 
    rename_with(~ str_replace(., 'Var_2', 'Issue: Time'), 
       starts_with('Var_2'))

-output

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
data1 <- data %>%
   set_names(str_replace_all(names(.), c("Var_1", "Var_2"), c("Issue 1 wave", "Issue 2 Wave")))

比较输出

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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

使用原始数据

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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_withends_withcontains )查找列名,或者在matches中传递正则表达式模式。where的一个用例是

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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的代码中,可以用summarise/across替换select/map

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
df %>%
    summarise(across(where(is.numeric), sd))

数据

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
data <- as_tibble(test)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66324365

复制
相关文章
MySQL中where条件查询(where)
ha_lydms
2023/08/09
3120
Where SLOW
对应结果依次是:正常、网络慢、客户端慢、服务端慢,如果使用 Wireshark,那么可能会发现时间显示格式有差异,改成相对时间就好了。
LA0WAN9
2021/12/14
5190
Where SLOW
numpy.where
Return elements chosen from x or y depending on condition.
狼啸风云
2019/10/22
7600
Where和Having
在SQL中,有一类函数能够作用于多条记录,如sum,count,max,avg等。被称为聚合函数,例如:
悠扬前奏
2019/05/31
8170
SQL WHERE 子句
如果只希望选取居住在城市 "Beijing" 中的人,我们需要向 SELECT 语句添加 WHERE 子句:
子润先生
2021/07/01
9770
tf.where
根据条件返回元素(x或y)。 如果x和y都为空,那么这个操作返回条件的真元素的坐标。坐标在二维张量中返回,其中第一个维度(行)表示真实元素的数量,第二个维度(列)表示真实元素的坐标。记住,输出张量的形状可以根据输入中有多少个真值而变化。索引按行主顺序输出。如果两者都是非零,则x和y必须具有相同的形状。如果x和y是标量,条件张量必须是标量。如果x和y是更高秩的向量,那么条件必须是大小与x的第一个维度匹配的向量,或者必须具有与x相同的形状。条件张量充当一个掩码,它根据每个元素的值选择输出中对应的元素/行是来自x(如果为真)还是来自y(如果为假)。如果条件是一个向量,x和y是高秩矩阵,那么它选择从x和y复制哪一行(外维),如果条件与x和y形状相同,那么它选择从x和y复制哪一个元素。
狼啸风云
2019/06/17
2.3K0
where in与join 查询
Oracle:当前所用版本中,限制in中的参数不能超过 1000个。当超出时会被报错"ORA-01795异常(where in超过1000)的解决"。
WindCoder
2018/09/19
1.9K0
ON、WHERE、HAVING的差别
ON 、WHERE、HAVING都能通过限制条件筛选数据,但他们的使用及其不同。以下我们来分析三者之间的差别。
全栈程序员站长
2022/07/13
9380
mybatis中 <where>标签
官方解释:where 元素只会在子元素返回任何内容的情况下才插入 “WHERE” 子句。而且,若子句的开头为 “AND” 或 “OR”,where 元素也会将它们去除。
DencyCheng
2020/12/09
1.2K0
ds mysql where my
腾讯云数据万象(Cloud Infinite,CI)能够实现对云上的图片、视频、音频、文档等数据进行处理,为客户提供专业一体化的数据处理解决方案,涵盖图片处理、内容审核、内容识别、媒体处理、文档服务等功能。
用户6369374
2020/10/13
1.6K1
SQL命令 WHERE(一)
WHERE子句最常用于指定一个或多个谓词,这些谓词用于限制SELECT查询或子查询检索到的数据(过滤出行)。 还可以在UPDATE命令、DELETE命令或INSERT(或INSERT or UPDATE)命令的结果集中使用WHERE子句。
用户7741497
2022/05/07
3K0
MySQL where条件探索
mysql认为可能还用到了唯一索引,但实际并没有用到,还是只用到了联合索引, 再看key_len的长度和情况1一样,所以验证结论,where后只有第一个范围查 找才生效(如果第一个索引失效,则顺延)。如果有联合索引,仅最左侧的索引字段生效. 范围查询+等值匹配 优先有索引的等值查询
晓果冻
2022/09/08
1.8K0
MySQL where条件探索
SQL基础【五、Where】
1:查询user_id等于1 的数据 Select * from user where user_id = 1 2:查询user_age大于等于12的数据 Select * from user where user_age >=12 3:查询user_age不等于12的数据 Select * from user where user_age <> 12 希望能对大家有所帮助。
红目香薰
2022/11/28
3790
SQL命令 WHERE CURRENT OF
WHERE CURRENT OF子句可用于基于游标的嵌入式SQL UPDATE或DELETE语句,以指定位于要更新或删除记录上的游标。 例如:
用户7741497
2022/05/07
6590
点击加载更多

相似问题

pivot_longer with tidyselect where,where,但不是谓词?

11

( (Where and Where) OR (Where and Where) ) CodeIgniter

119

为什么可以在dplyr helper函数"where“中检测到tidyselect helper函数”where“?

15

"where“+ "or_where,"or_where”省略条件

22

如何在自定义包中使用tidyselect "where“?

11
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文