按类别修改data.table的随机行中的值

时间:2015-07-24 17:55:17

标签: r random data.table

我有一个包含两列的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命令的解决方案...... 谢谢!

1 个答案:

答案 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]