基本上是对此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)]
我想要实现的是,我可以更改某个列的值,该列是某个子集的一部分,并从该子集中随机选择。
答案 0 :(得分:5)
dt[city == "New York"]
返回一个全新的对象,您可以通过引用更新该对象。但这不影响dt
。即,
dt[expr, col := val] != dt[expr][, col := val]
第一个表达式更新dt
expr
评估为TRUE
的位置。第二个更新从dt[expr]
返回的子集。除非您将结果分配回变量,否则无法取回结果。
答案 1 :(得分:5)
除了以上所有建议外,您还可以对索引进行采样(可以使用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