dplyr 在 for 循环内发生变异 - 问题

Ank*_*bra 2 for-loop r dplyr

我正在使用 tidyverse 在 R 中执行数据分析和清理。我有一个包含 23 列的数据框,其中包含值“NO”、“STEADY”、“UP”和“down”。我想将这 23 列中的所有值在“NO”、“STEADY”的情况下更改为 0,在其他情况下更改为 1。

我所做的是,我按名称键创建了一个列表,其中保留了所有列,之后我使用 for 循环、ifelse 语句和 mutate。

请看下面的代码

# Column names are kept in the list by name keys

keys = c('metformin', 'repaglinide', 'nateglinide', 'chlorpropamide', 'glimepiride', 
'glipizide', 'glyburide', 'pioglitazone', 'rosiglitazone', 'acarbose', 'miglitol', 
'insulin', 'glyburide-metformin', 'tolazamide', 'metformin-pioglitazone',
'metformin-rosiglitazone', 'glimepiride-pioglitazone', 'glipizide-metformin', 
'troglitazone', 'tolbutamide', 'acetohexamide')
Run Code Online (Sandbox Code Playgroud)

之后,我使用以下代码来获得所需的结果:

for (col in keys){
  Dataset = Dataset %>%
    mutate(col = ifelse(col %in% c('No','Steady'),0,1)) }
Run Code Online (Sandbox Code Playgroud)

我期待它会进行我需要的更改,但此后什么也没有发生。(没有错误消息,也没有期望的结果)

之后,我进一步研究并执行了以下代码

for (col in keys){
 print(col)}
Run Code Online (Sandbox Code Playgroud)

它给我列表的元素作为字符,例如“二甲双胍”

所以,我想 - 可能这就是问题所在。因此,我使用下面的代码将键转换为符号:

keys_new = sym(keys)
Run Code Online (Sandbox Code Playgroud)

之后我再次运行相同的代码:

for (col in keys_new){
   Dataset = Dataset %>%
     mutate(col = ifelse(col %in% c('No','Steady'),0,1))} 
Run Code Online (Sandbox Code Playgroud)

它给了我以下错误 -

match(x, table, nomatch = 0L) 中的错误:“match”需要向量参数

毕竟这一切。我还尝试创建一个函数来获得所需的结果,但这也不起作用:

change = function(name){
   Dataset = Dataset %>%
      mutate(name = ifelse(name %in% c('No','Steady'),0,1),
      name = as.factor(name))
      return(Dataset)}

for (col in keys){
   change(col)}
Run Code Online (Sandbox Code Playgroud)

这没有执行任何操作。(没有错误消息,也没有期望的结果)

当keys_new被放置在这段代码中时:

for (col in keys_new){
   change(col)}
Run Code Online (Sandbox Code Playgroud)

我遇到了同样的错误:

match(x, table, nomatch = 0L) 中的错误:“match”需要向量参数

请指导

Shr*_*ree 5

无需循环或跟踪列名称。您可以使用mutate_all-

Dataset %>% 
  mutate_all(~ifelse(. %in% c('No','Steady'), 0, 1))
Run Code Online (Sandbox Code Playgroud)

另一种方式,感谢 Rui Barradas -

Dataset %>% 
  mutate_all(~as.integer(!. %in% c('No','Steady')))
Run Code Online (Sandbox Code Playgroud)