【问题标题】:Restrict column to specific range using data.table in R使用 R 中的 data.table 将列限制为特定范围
【发布时间】:2016-01-29 23:09:35
【问题描述】:

我在 R 中使用 data.table 包并希望对列执行操作。具体来说,我想强制所有值都是 (0, 1)。

让我们在这里举一个简单的例子:

data = data.table(x = rnorm(10))

我的数据存储为data.table,所以我想我可以这样做:

data[, newx := max(min(x, 1), 0)]

但是聚合函数(minmax)计算向量的最小值/最大值。

好的,所以我进行更改并添加 by=.I 声明:

data[, newx := max(min(x, 1), 0), by=.I]

但这也不起作用!

使用data.table完成此类任务的正确方法是什么?

【问题讨论】:

  • 可以使用by = seq_along(x)

标签: r data.table


【解决方案1】:

您可以创建一个虚拟索引并在不再需要时将其删除,如下所示:

data[,Idx := .I][, newx := max(min(x, 1), 0), by = "Idx"][, Idx := NULL][]

#              x      newx
# 1:  1.12585452 1.0000000
# 2:  0.82343338 0.8234334
# 3: -1.02227889 0.0000000
# 4:  1.42761362 1.0000000
# 5:  0.77371518 0.7737152
# 6: -0.22261010 0.0000000
# 7: -0.64862015 0.0000000
# 8: -0.45663845 0.0000000
# 9: -0.96332902 0.0000000
# 10: -0.04396755 0.0000000

【讨论】:

  • 这是什么炼金术!?真的谢谢你!但是为什么这不适用于by=.I
  • 嗯,您可能需要深入研究data.table 源代码才能确认,但我认为因为存在by 子句(其中by != .I)它维护一个索引序列对于每个组,它本身不能用作分组变量。在帮助文件中,.I is an integer vector equal to seq_len(nrow(x)). While grouping, it holds for each item in the group, it's row location in x. This is useful to subset in j; e.g. DT[, .I[which.max(somecol)], by=grp].
  • 看不到需要创建Idxdata[ , newx := max(min(x, 1), 0), by = seq_along(x)] 似乎工作方式相同(正如@jangorecki 指出的那样)
【解决方案2】:

你也可以尝试简单的ifelse

data[, newX:= ifelse(x >1,1,x)][, newX:= ifelse(x < 0, 0,x)]

【讨论】:

  • 这里只需要一个ifelseifelse(x %between% c(0, 1), x, x&gt;0)。还有,ifelse is slow;最好只使用三行代码:data[ , newX := x]; data[x &lt; 0, newX := 0]; data[x &gt; 1, newX := 1]
【解决方案3】:

更简单、更快捷的是分段定义:

set.seed(13084)
data = data.table(x = rnorm(10))
> data[ , newx := (xg1 <- x > 1) + x * (!xg1 & x > 0)][]
             x      newx
 1:  0.7842597 0.7842597
 2: -0.3935582 0.0000000
 3: -2.3379063 0.0000000
 4: -1.7428335 0.0000000
 5:  0.1678035 0.1678035
 6: -0.9558911 0.0000000
 7: -1.5592778 0.0000000
 8:  0.9358569 0.9358569
 9:  0.7778178 0.7778178
10:  1.0937594 1.0000000

【讨论】:

    猜你喜欢
    • 2018-03-14
    • 2023-03-12
    • 2020-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多