我有一个包含两列的data.table,比如说city和score
data.table(city = sample(c("Cape Town", "New York", "Tel Aviv"),size=15, replace = TRUE), score = sample(x=1:10, size = 15, replace=TRUE))
city score
1: Tel Aviv 5
2: New York 5
3: New York 8
4: Cape Town 10
5: Tel Aviv 7
6: New York 10
7: Tel Aviv 8
8: Cape Town 2
9: Tel Aviv 2
10: Cape Town 2
11: Cape Town 5
12: New York 1
13: Tel Aviv 3
14: Cape Town 6
15: New York 5
我想将每个城市的分数更改为0到两个随机行(即,特拉维夫为2行,纽约为2行等)。请注意,每个城市总会有两行以上(我的真实数据非常大......)。理想情况下,我想要一个基于data.table命令的解决方案...... 谢谢!
答案 0 :(得分:6)
我们对每个“城市”采用sample
行数(.N
)并获取行索引(.I
)。将该行索引用作i
,我们将(:=
),与该索引对应的“得分”分配为“0”。
i1 <- dt[, .I[sample(.N, 2)], by = city]$V1
dt[i1, score:=0L]
如果'city'只有一行,我不确定是否要用'0'代替那一行。如果我们用'0'替换
i1 <- dt[, if(.N<2) .I else .I[sample(.N,2)] ,city]$V1
dt[i1, score:=0L]
如果我们不想更改少于2行的“城市”的“得分”,
i1 <- dt[, if(.N>1) .I[sample(.N,2)] ,city]$V1
dt[i1, score := 0L]
或者@Frank评论说,我们可以sample
上的.I
而不是.I
包裹(这里我们也会更改'city'中的nrows分数&lt; 2 )
i1 <- dt[, if(.N<2) .I else sample(.I, 2) ,city]$V1
dt[i1, score := 0L]