在mutate_at dplyr中使用pmin为值建立索引以舍入到最接近的百分位值

xqkwcwgp  于 2023-02-14  发布在  其他
关注(0)|答案(1)|浏览(126)

我有一个集合中的一些数字变量和他们的总和在一个单独的变量。我试图抑制一个单元格低于一定的阈值和四舍五入的下一个最小值到最近的百分之一的值,使屏蔽值不能被反向工程。
我的数据是这样的。
| 身份证|共计|变量X1|方差X2|方差X3|方差X4|变异性1|... 变异体Z12|
| - ------|- ------|- ------|- ------|- ------|- ------|- ------|- ------|
| 1个|一千五百|二十五|四百|八百|二百七十五|一百八十|六十|
| 第二章|十三|四百|三十五|七百五十|一百一十五|三十|一百一十|
掩膜数据应如下所示
| 身份证|共计|变量X1|方差X2|方差X3|方差X4|变异性1|......变量Z12|
| - ------|- ------|- ------|- ------|- ------|- ------|- ------|- ------|
| 1个|一千五百|小于100|四百|八百|小于300|一百八十|小于100|
| 第二章|小行星1200|四百|小于100|七百五十|小于200|小于100|一百一十|
我添加了两个额外的变量VarY1和VarZ12来解释使用dplyr中的mutate_at()函数的必要性,因为变量数量相当大,但可以在contains()中使用重复字符串。我试图使其可重复,因为这是我计划做的一个重复性任务。
我采用的方法是首先将小于100的值赋给NAs,然后尝试以某种方式索引pmin值并将其舍入到最接近的百分位数,然后将其转换为字符以添加"〈",同时还将NAs替换为字符"〈100"。
我已经到了将NA赋给小于100的值的部分,但是我遇到了替换变量集的下一个最小值的主要障碍。
下面是我目前为止用NA替换到的代码。

data %>%
mutate_at(vars(matches("VarsX"), ~ case_when(.x < 100 ~ NA,
                                             T ~ .x))

下一步我该怎么做?任何方向或代码的帮助都是非常感谢的。谢谢。

l3zydbqr

l3zydbqr1#

使用dplyr::rowwise()near()查找最小值:

library(dplyr)

data %>%
  rowwise() %>%
  mutate(
    across(matches("Var"), \(x) ifelse(x < 100, NA, x)), 
    across(
      matches("VarX"),
      \(x) if_else(
        near(x, min(c_across(matches("VarX")), na.rm = TRUE)),
        paste0("<", 100 * ceiling(x / 100)),
        as.character(x)
      )
    ),
    across(matches("Var"), \(x) if_else(is.na(x), "<100", as.character(x)))
  ) %>%
  ungroup()
# A tibble: 2 × 8
     id Total VarX1 VarX2 VarX3 VarX4 VarY1 VarZ12
  <int> <int> <chr> <chr> <chr> <chr> <chr> <chr> 
1     1  1500 <100  400   800   <300  180   <100  
2     2  1300 400   <100  750   <200  <100  110

请注意,mutate_at()mutate(across())的朋友have been superseded,如上所述。

相关问题