【问题标题】:Change values for a random selection of a data.table subset更改 data.table 子集的随机选择的值
【发布时间】:2016-08-31 13:53:51
【问题描述】:

基本上是此question 的扩展,因为我注意到,如果您第二次设置子集,则无法更改列的值。

random.length  <-  sample(x = 15:30, size = 1)
dt <- data.table(city=sample(c("Cape Town", "New York", "Pittsburgh", "Tel Aviv", "Amsterdam"), size=random.length, replace = TRUE), score = sample(x=1:10, size = random.length, replace=TRUE)) 
set.seed(1)
dt[sample(.N,3), score :=9999]
set.seed(1)
dt[sample(.N,3),]

这按预期工作,并将三个随机选择的城市的分数更改为 9999。尽管如果您在第一步中进行子集化,然后进行抽样并尝试分配新的分值,这是不可能的。

set.seed(1)
dt[city == "New York",][sample(.N,1), score := 55555]
set.seed(1)
dt[city == "New York",][sample(.N,1)]

我想要实现的是我可以更改某个列的值,该列是某个子集的一部分并从该子集中随机选择。

【问题讨论】:

  • "对于三个随机选择的城市" -- 你选择了行,而不是城市。顺便说一句,你的set.seed 来得太晚了(在使用sample 之后)。
  • set.seed() 只是为了更容易看到,在第一种情况下分数会发生变化,可以直接检查不同的分数,而在第二种情况下没有任何变化。跨度>
  • 也许可以dt[sample(dt[, .I[city == "New York"]], 3), score := 55555]。或者,如果您想覆盖 每个 城市中的 3 个随机 obs,您可以执行 dt[dt[, .I[sample(.N, 3)], by = city]$V1, score := 55555]

标签: r data.table


【解决方案1】:

除了上述所有建议之外,您还可以对索引进行采样(可以使用which函数计算):

dt[sample(which(city == "New York"), 1), score:=555L]
dt
#           city score
#  1:   Tel Aviv     8
#  2:  Amsterdam     3
#  3:  Cape Town    10
#  4:   New York     1
#  5:  Cape Town    10
#  6: Pittsburgh     2
#  7: Pittsburgh     8
#  8:  Amsterdam    10
#  9:  Amsterdam     8
# 10:  Amsterdam     4
# 11:   Tel Aviv     7
# 12:  Amsterdam     2
# 13: Pittsburgh     1
# 14:  Amsterdam     3
# 15: Pittsburgh     2
# 16:   New York     7
# 17:   Tel Aviv    10
# 18:   New York    10
# 19:  Cape Town     1
# 20:  Amsterdam     7
# 21:  Amsterdam     3
# 22:   New York   555
# 23:  Cape Town     6
# 24:   New York     1
# 25:   Tel Aviv    10
#           city score

【讨论】:

    【解决方案2】:

    dt[city == "New York"] 返回一个全新的对象,您通过引用对其进行更新。但这会影响dt。即,

    dt[expr, col := val] != dt[expr][, col := val]
    

    第一个表达式更新dt,其中expr 的计算结果为TRUE。第二个更新从dt[expr] 返回的子集。除非将结果分配回变量,否则无法取回结果。

    【讨论】:

    • 好的,这就是我的怀疑,感谢您的快速回答。
    • 我觉得 := 赋值有点奇怪的是,它根本没有给你一个有意义的错误或错误信息。尤其是在这种情况下,实际上分配任何东西都没有意义,这有点奇怪,起初它似乎成功了,或者?在这些情况下是否有可能以某种方式显示错误?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-02-20
    • 1970-01-01
    • 2012-08-10
    • 2019-07-30
    • 2013-11-27
    • 1970-01-01
    • 2010-09-13
    相关资源
    最近更新 更多