如何在dplyr中调用对象的列名?

7d7tgy0s  于 2023-05-20  发布在  其他
关注(0)|答案(2)|浏览(100)

我尝试使用dplyr将多个列中的所有零替换为NA。然而,由于我有许多变量,我不想一个一个地调用它们,而是将它们存储在一个对象中,以便以后调用。
这是我所做的一个最小的例子:

library(dplyr)

Data <- data.frame(var1 = c(1:10), var2 = rep(c(0, 4), 5), var3 = rep(c(2, 0, 3, 4, 5), 2), var4 = rep(c(7, 0), 5))

col <- Data[,c(2:4)]

Data <- Data %>%
  mutate(across(col, na_if, 0))

但是,如果我这样做,我会得到以下错误消息:

Error: Problem with 'mutate()' input '..1'.
x Must subset columns with a valid subscript vector.
x Subscript has the wrong type 'data.frame<

  var2: double 

  var3: double

  var4: double>'.

i It must be numeric or character.

i Input '..1' is '(function (.cols = everything(), .fns = NULL, ..., .names = NULL) ...'.

我曾尝试将col的格式更改为tibble,但没有帮助。
有谁能告诉我如何使这个工作吗?

aurhwmvo

aurhwmvo1#

如果您只想针对 numeric 列,那么可以尝试像where()这样的辅助函数,它将选择函数返回TRUE的任何变量。我想这里唯一的好处是针对特定类型的变量。

library(dplyr)

# The where() function will select var2, var3, and var4
# Note: var1 is an integer so the function returns FALSE
# Useful when you want to completely ignore a specific type of variable

Data <- data.frame(
  var1 = c(1:10),   
  var2 = rep(c(0, 4),5), 
  var3 = rep(c(2, 0 ,3, 4, 5), 2), 
  var4 = rep(c(7, 0), 5)
  )

Data |>
  mutate(across(where(is.numeric), ~na_if(., 0)))

下面是输出:

var1 var2 var3 var4
1     1   NA    2    7
2     2    4   NA   NA
3     3   NA    3    7
4     4    4    4   NA
5     5   NA    5    7
6     6    4    2   NA
7     7   NA   NA    7
8     8    4    3   NA
9     9   NA    4    7
10   10    4    5   NA

您将在这里找到的另一个答案很棒,它允许您选择任意数量的列。

3zwjbxry

3zwjbxry2#

这里,col应该是数据的名称。由于有一个函数名为col,我们可以用不同的方式命名对象,用all_of Package ,并将across中的0替换为NA

library(dplyr)
col1 <- names(Data)[2:4]
Data <- Data %>%
   mutate(across(all_of(col1) , na_if, 0))
  • 输出
Data
#   var1 var2 var3 var4
#1     1   NA    2    7
#2     2    4   NA   NA
#3     3   NA    3    7
#4     4    4    4   NA
#5     5   NA    5    7
#6     6    4    2   NA
#7     7   NA   NA    7
#8     8    4    3   NA
#9     9   NA    4    7
#10   10    4    5   NA

注意:这里OP询问了基于索引或列名的循环

相关问题