我有一个包含多个列(可以是动态列数)的data.table,我希望对其应用最小值.每列都有自己的特定最小值.

我的data.table的基本版本是这样的:

library(data.table)
dt <- data.table(
  urn = 1:10,
  col1 = 5:14,
  col2 = 11:20
)

Note: I've only included two columns with values that need to have minimums for the reprex. There could be more columns, hence trying to code this a little bit dynamically.

我的方法是嵌套lapply个语句等等,但是我不知道如何在lapply个函数中调用我的列.

min_vals <- c(10, 15)
my_cols <- grep("^col", colnames(dt), value = TRUE)

## First approach
dt[,
  (my_cols) := lapply(min_vals, function(x) {
    my_cols[my_cols < x] <- x
  })]

## Second Approach
dt[,
  (my_cols) := lapply(min_vals, function(x) {
    ifelse(my_cols < x, x, my_cols)
  })]

目前,第一种方法将所有行设置为相应的min_vals,而不仅仅是低于min_vals的值.第二种方法根本不起作用,反而会出错.

所需的输出如下所示:

dt
#       urn  col1  col2
#     <int> <int> <int>
#  1:     1    10    15
#  2:     2    10    15
#  3:     3    10    15
#  4:     4    10    15
#  5:     5    10    15
#  6:     6    10    16
#  7:     7    11    17
#  8:     8    12    18
#  9:     9    13    19
# 10:    10    14    20

如果有一种解决方案允许动态编号与col<number>格式匹配的列,那就太好了.

推荐答案

我们可以使用Map而不是lapply,正如@Roland在注释中指出的那样,i)循环.SD作为第一个输入(用mycols指定.SDcols),并使用ii)更快的fielse而不是ifelse.

library(data.table)

dt[, (my_cols) := Map(\(x, m) fifelse(x < m, m, x),
                      .SD,
                      min_vals),
   .SDcols = my_cols]

dt
#>     urn col1 col2
#>  1:   1   10   15
#>  2:   2   10   15
#>  3:   3   10   15
#>  4:   4   10   15
#>  5:   5   10   15
#>  6:   6   10   16
#>  7:   7   11   17
#>  8:   8   12   18
#>  9:   9   13   19
#> 10:  10   14   20

@mwau建议在 comments 中使用pmax而不是fifelse,这是另一个很棒的 Select :

dt[, c(my_cols) := Map(\(x, y) pmax(x, y), .SD, min_vals), .SDcols = my_cols]
#> same result as above

来自运营部门的数据

dt <- data.table(
  urn = 1:10,
  col1 = 5:14,
  col2 = 11:20
)

min_vals <- c(10, 15)
my_cols <- grep("^col", colnames(dt), value = TRUE)

创建于2023-03-20,共reprex v2.0.2

R相关问答推荐

在ggplot的注释表格中突出显示最大值

在位置周围设定一个半径并识别该半径内的其他位置

R Tidymodels textercipes-使用spacyR进行标记化-如何从生成的标记列表中删除标点符号

筛选出以特定顺序患病的个体

如何改变时间图R中的悬停信息?

如何优化向量的以下条件赋值?

IMF IFS数据以R表示

如何根据嵌套元素的名称高效而优雅地确定它属于哪个列表?

R函数,用于生成伪随机二进制序列,其中同一数字在一行中不出现超过两次

迭代到DataFrame列并获得成对的值列表(col1->;col2、col2->;col3、col3->;col4等)的正确方法.

如何在PDF格式的kableExtra表格中显示管道字符?

使用gt_summary是否有一种方法来限制每个变量集进行配对比较?

快速合并R内的值

如何显示准确的p值而不是<;0.001*?

按两个因素将观测值分组后计算单独的百分比

R预测包如何处理ARIMA(Auto.arima函数)中的缺失值

在ggplot2图表中通过端点连接点

从字符串01JAN2021创建日期

如何在R曲线图弹出窗口中更改r和theta标签

R data.设置函数&;连接中的列值而不使用for循环的表方法?