【发布时间】: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