使用dplyr优雅地将多个二进制列转换为基于R中列名的因子
我试图将二进制变量的数据帧转换为因子,基于具有特定列顺序的列名(稍后用于刻面绘制、建模等)。我有一个粗糙的,但工作的函数,我现在试图转换成dplyr管道 工作职能:使用dplyr优雅地将多个二进制列转换为基于R中列名的因子,r,dataframe,dplyr,tidyverse,R,Dataframe,Dplyr,Tidyverse,我试图将二进制变量的数据帧转换为因子,基于具有特定列顺序的列名(稍后用于刻面绘制、建模等)。我有一个粗糙的,但工作的函数,我现在试图转换成dplyr管道 工作职能: library(dplyr) library(tidyr) df <- tribble( ~id, ~A, ~B, ~C, "X", 1, 0, 0, "Y", 0, 0, 1, "Z", 1, 1, 1 ) df1 = df for (name
library(dplyr)
library(tidyr)
df <- tribble(
~id, ~A, ~B, ~C,
"X", 1, 0, 0,
"Y", 0, 0, 1,
"Z", 1, 1, 1
)
df1 = df
for (name in c("A", "B", "C")) {
df1[[name]] = factor(df1[[name]], levels = c(0, 1), labels = paste0(c("not ", ""), name))
}
df1$A
#> [1] A not A A
#> Levels: not A A
第二次尝试使用dplyr。A
df %>%
mutate(across(A:C, function(x) factor(x, levels = c(0, 1))))
#> # A tibble: 3 x 4
#> id A B C
#> <chr> <fct> <fct> <fct>
#> 1 X 1 0 0
#> 2 Y 0 0 1
#> 3 Z 1 1 1
# Unable to set custom factor labels
df%>%
变异(跨越(A:C,函数(x)因子(x,级别=C(0,1)))
#>#tibble:3 x 4
#>身份证
#>
#>1x100
#>2 Y 0 0 1
#>3Z11
#无法设置自定义因子标签
有没有一种方法可以优雅地实现我在使用dplyr/tidyverse后的目标?我们可以使用
cur\u column()
获取列的名称
library(dplyr) #dplyr > 1.0.0
df1 <- df %>%
mutate(across(A:C, function(x)
factor(x, c(0, 1), paste0(c("not ", ""), cur_column()))))
df1
# id A B C
# <chr> <fct> <fct> <fct>
#1 X A not B not C
#2 Y not A not B C
#3 Z A B C
df1$A
#[1] A not A A
#Levels: not A A
library(dplyr)#dplyr>1.0.0
df1%
变异(跨越(A:C,函数(x)
因子(x,c(0,1),粘贴0(c(“非”),cur_column())
df1
#身份证
#
#1 X A不是B不是C
#2 Y不是A不是B C
#3 Z A B C
df1美元/年
#[1] A不是A
#级别:不是A
我们可以使用cur\u column()
获取列的名称
library(dplyr) #dplyr > 1.0.0
df1 <- df %>%
mutate(across(A:C, function(x)
factor(x, c(0, 1), paste0(c("not ", ""), cur_column()))))
df1
# id A B C
# <chr> <fct> <fct> <fct>
#1 X A not B not C
#2 Y not A not B C
#3 Z A B C
df1$A
#[1] A not A A
#Levels: not A A
library(dplyr)#dplyr>1.0.0
df1%
变异(跨越(A:C,函数(x)
因子(x,c(0,1),粘贴0(c(“非”),cur_column())
df1
#身份证
#
#1 X A不是B不是C
#2 Y不是A不是B C
#3 Z A B C
df1美元/年
#[1] A不是A
#级别:不是A
太棒了,谢谢你,这正是我想要的!从未在dplyr
中使用或见过cur\uu
函数,因此不知道它们的存在。将来肯定会使用它们。太棒了,谢谢你,这正是我想要的!从未在dplyr
中使用或见过cur\uu
函数,因此不知道它们的存在。将来肯定会使用它们