如何从 dplyr 中的对象调用列名?
How to call column names from an object in dplyr?
我正在尝试使用 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,但这没有帮助。
谁能告诉我如何进行这项工作?
这里的col
应该是数据的名称。因为有函数名带col
,我们可以给对象起不同的名字,用all_of
包起来,把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 询问了基于索引或列名的循环
如果您只想将 numeric 列设为目标,则尝试 where()
等辅助函数,它将 select 函数 [=] 中的任何变量22=] 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
您会在此处找到的另一个答案很棒,它允许您 select 任意数量的列。
我正在尝试使用 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,但这没有帮助。
谁能告诉我如何进行这项工作?
这里的col
应该是数据的名称。因为有函数名带col
,我们可以给对象起不同的名字,用all_of
包起来,把across
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 询问了基于索引或列名的循环
如果您只想将 numeric 列设为目标,则尝试 where()
等辅助函数,它将 select 函数 [=] 中的任何变量22=] 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
您会在此处找到的另一个答案很棒,它允许您 select 任意数量的列。