R 动态确定数据帧列是否存在,如果存在则进行变异

R 动态确定数据帧列是否存在,如果存在则进行变异,r,dplyr,R,Dplyr,我有基于客户机名称从数据库中提取和处理数据的代码。有些客户端可能有不包含特定列名的数据,例如,last\u name或first\u name。对于不使用姓或名的客户,我不在乎。对于使用这两个字段中任何一个的客户机,我需要mutate()那些带有toupper()的列,以便我可以在ETL过程中稍后加入这些标准化字段 现在,我正在使用一系列if()语句和一些辅助函数来查找数据帧的名称,然后在它们存在时进行变异 但这是处理这类任务的最佳方式吗?动态查看数据帧中是否存在列名,如果存在,则对其进行变异?

我有基于客户机名称从数据库中提取和处理数据的代码。有些客户端可能有不包含特定列名的数据,例如,
last\u name
first\u name
。对于不使用
的客户,我不在乎。对于使用这两个字段中任何一个的客户机,我需要
mutate()
那些带有
toupper()
的列,以便我可以在ETL过程中稍后加入这些标准化字段

现在,我正在使用一系列
if()
语句和一些辅助函数来查找数据帧的名称,然后在它们存在时进行变异


但这是处理这类任务的最佳方式吗?动态查看数据帧中是否存在列名,如果存在,则对其进行变异?在这个函数中必须有多个
if()
语句,这似乎很奇怪是否有更精简的方法来处理这些数据?

您可以使用
mutate\u at
中的一个
,两者都来自
dplyr
。只有当该列与
c(“名字”、“姓氏”)中的一个匹配时,该列才会发生变化
。如果不匹配,它将生成一个简单的警告,但您可以忽略或抑制它

library(dplyr)

d %>%
  mutate_at(vars(one_of(c("first_name", "last_name")), toupper)

  id col_name last_name
1 19     7461         V
2 52     9651         H
3 56     1901         P
4 13     7866         Z
5 25     9527         U

# example with no match
b %>%
  mutate_at(vars(one_of(c("first_name", "last_name"))), toupper)

  id col_name another_col
1 34     9315        8686
2 26     5598        4124
3 17     3318        2182
4 32     1418        4369
5 49     4759        6680
Warning message:
Unknown variables: `first_name`, `last_name`
下面是一组其他的
?在
dplyr
-

这些函数允许您根据变量的名称选择变量

以()开头:以前缀开头

以()结束:以前缀结束

contains():包含文本字符串

matches():匹配正则表达式

num_range():一个数字范围,如x01、x02、x03

():字符向量中的变量之一

everything():所有变量

> b %>% mutate_first_last()
  id col_name another_col
1 48     8318        6207
2 39     7155        7170
3 16     4486        4321
4 55     2521        8024
5 15     1412        4875
> d %>% mutate_first_last()
  id col_name last_name
1 64     7438         A
2 43     4551         Q
3 48     7401         K
4 78     3682         Z
5 87     2554         J
library(dplyr)

d %>%
  mutate_at(vars(one_of(c("first_name", "last_name")), toupper)

  id col_name last_name
1 19     7461         V
2 52     9651         H
3 56     1901         P
4 13     7866         Z
5 25     9527         U

# example with no match
b %>%
  mutate_at(vars(one_of(c("first_name", "last_name"))), toupper)

  id col_name another_col
1 34     9315        8686
2 26     5598        4124
3 17     3318        2182
4 32     1418        4369
5 49     4759        6680
Warning message:
Unknown variables: `first_name`, `last_name`