在dplyr mutate(cross)调用中创建因子失败

在dplyr mutate(cross)调用中创建因子失败,r,dplyr,mutate,across,R,Dplyr,Mutate,Across,使用NAs在数据集中创建因子级别适用于单个列,但我需要迭代更多的列(所有列都以“impact.”开头),并且在dplyr mutate(跨列)中遇到了一个问题 我做错了什么 下面是雷普雷克斯 library(tribble) library(dplyr) df <- tribble(~id, ~tumour, ~impact.chemo, ~impact.radio, 1,'lung',NA,1, 2,'lung',1,NA, 3,'lun

使用NAs在数据集中创建因子级别适用于单个列,但我需要迭代更多的列(所有列都以“impact.”开头),并且在dplyr mutate(跨列)中遇到了一个问题

我做错了什么

下面是雷普雷克斯

library(tribble)
library(dplyr)

df <- tribble(~id, ~tumour, ~impact.chemo, ~impact.radio,
        1,'lung',NA,1,
        2,'lung',1,NA,
        3,'lung',2,3,
        4,'meso',3,4,
        5,'lung',4,5)

# Factor labels
trt_labels <- c('Planned', 'Modified', 'Interrupted', 'Deferred', "Omitted")

# Such that factor levels match labels as, retaining NAs where present:
data.frame(level = 1:5,
           label = trt_labels)

# Create factor works for individual columns
factor(df$impact.chemo, levels = 1:5, labels = trt_labels)
factor(df$impact.radio, levels = 1:5, labels = trt_labels)

# But fails inside mutate(across)
df %>% 
  mutate(across(.cols = starts_with('impact'), ~factor(levels = 1:5, labels = trt_labels)))
库(tribble)
图书馆(dplyr)

df仅将@27敻9的注释作为一个答案:您在
cross
中指定的
purr
样式的lambda函数是不正确的,因为它需要第一个参数,这是函数应该引用的对象(在这种情况下,是
cross
选择的数据帧列)

要解决您的问题,您应该在lambda函数中插入
.x
,该函数是
函数(x)x
的快捷方式-有关
purr
样式lambda函数的更多信息,请参阅此

df %>% 
  mutate(across(.cols = starts_with('impact'), ~factor(.x, levels = 1:5, labels = trt_labels)))

# A tibble: 5 x 4
#      id tumour impact.chemo impact.radio
#   <dbl> <chr>  <fct>        <fct>       
# 1     1 lung   NA           Planned     
# 2     2 lung   Planned      NA          
# 3     3 lung   Modified     Interrupted 
# 4     4 meso   Interrupted  Deferred    
# 5     5 lung   Deferred     Omitted
df%>%
突变(跨越(.cols=start_with('impact'),~factor(.x,levels=1:5,labels=trt_labels)))
#一个tibble:5x4
#id肿瘤影响。化疗影响。无线电
#                     
#1计划中的1个
#2 2肺动脉瘤
#3 3肺功能不全
#4中观干扰延迟
#5.忽略了5项

lambda函数不正确-您需要为对象参数包含
.x
~因子(.x,levels=1:5,labels=trt_labels))
。或者您甚至可以使用
.1
,但您必须选择一个。太棒了,谢谢大家-27ñ9&Ric解决了它:添加
.x
参数修复了它。对于未来用户:如果每列不包含≥每个系数级别的1,则需要指定系数级别(此处
级别=1:5
),以便观察到的或明确说明的级别数=标签数。