Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用dplyr优雅地将多个二进制列转换为基于R中列名的因子_R_Dataframe_Dplyr_Tidyverse - Fatal编程技术网

使用dplyr优雅地将多个二进制列转换为基于R中列名的因子

使用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

我试图将二进制变量的数据帧转换为因子,基于具有特定列顺序的列名(稍后用于刻面绘制、建模等)。我有一个粗糙的,但工作的函数,我现在试图转换成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 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
函数,因此不知道它们的存在。将来肯定会使用它们