我试图在mutate() + across()中创建一个函数,它可以将任何具有五个或更少唯一值(或任意数)的变量变为因子,并在后面使用该因子进行分组.我认为函数的逻辑是正确的,但我得到了一些不正确的维度错误(西班牙语错误).为了简单起见,我正在使用mtcars数据库.

mtcars %>%
    mutate(across(1:ncol(.), 
        function(x) {
                if_else(length(unique(x[,i]))<=5, 
            as.factor(x), 
          x)}
    ))

Error: Problem with `mutate()` input `..1`.
i `..1 = across(...)`.
x número incorreto de dimensiones
Run `rlang::last_error()` to see where the error occurred.

任何帮助或建议都将不胜感激.

推荐答案

这里我们需要if/else,因为ifelse/if_else要求所有参数长度相等.length(unique表达式返回长度为1的逻辑值,这可能会 destruct 条件.此外,对于dplyr,我们可以使用select-helperseverything()来 Select 所有列

library(dplyr)
out <- mtcars %>%
    mutate(across(everything(), 
        function(x) {
                if(length(unique(x))<=5) 
            as.factor(x) else  
          x}
    ))

-输出

> str(out)
'data.frame':   32 obs. of  11 variables:
 $ mpg : num  21 21 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 ...
 $ cyl : Factor w/ 3 levels "4","6","8": 2 2 1 2 3 2 3 1 1 2 ...
 $ disp: num  160 160 108 258 360 ...
 $ hp  : num  110 110 93 110 175 105 245 62 95 123 ...
 $ drat: num  3.9 3.9 3.85 3.08 3.15 2.76 3.21 3.69 3.92 3.92 ...
 $ wt  : num  2.62 2.88 2.32 3.21 3.44 ...
 $ qsec: num  16.5 17 18.6 19.4 17 ...
 $ vs  : Factor w/ 2 levels "0","1": 1 1 2 2 1 2 1 2 2 2 ...
 $ am  : Factor w/ 2 levels "0","1": 2 2 2 1 1 1 1 1 1 1 ...
 $ gear: Factor w/ 3 levels "3","4","5": 2 2 2 1 1 1 1 2 2 2 ...
 $ carb: num  4 4 1 1 2 1 4 2 2 4 ...

此外,lambda函数可以简洁地使用~并使用n_distinct

mtcars %>% 
   mutate(across(everything(), 
        ~ if(n_distinct(.x) <=5) as.factor(.x) else .x))

R相关问答推荐

R -创建一列,指示另一列是否具有相同的值

如何替换某个字符的所有出现,但如果该字符是字符串中的第一个,则不替换?

如何使用TukeyHSD绘制事后概率热图

如何在ggplot 2 geom_segment图表中将UTC转换为EET?

如何根据条件计算时差(天)

如何直接从R中的风险分数计算c指数?

计算时间段的ECDF(R)

在R中无法读入具有Readxl和lApply的数据集

根据文本字符串中的值粘贴新列

为什么我的基准测试会随着样本量的增加而出现一些波动?

用两种 colored颜色 填充方框图

Ggplot2中geom_tile的动态zoom

如何使这些react 表对象相互独立?

R中的类别比较

自动STAT_SUMMARY统计与手动标准误差之间的差异

我将工作代码重构为一个函数--现在我想不出如何传递轴列参数

将列表中的字符串粘贴到R中for循环内的dplyr筛选器中

R try Catch in the loop-跳过缺少的值并创建一个DF,显示跳过的内容

使用&Fill&Quot;在gglot中创建 colored颜色 渐变

使用其他DF中的文件名将列表中的每个元素保存到文件中