我有一个包含每个“用户”X 行的数据框,其中 X 在用户之间不是常量。我想做的是能够生成随机数来填充一个新列,但对于每个“用户”,随机数在与该用户对应的所有行中都是相同的。例如,数据可能如下所示:
user feature1 feature2
1 "A" "B"
1 "L" "L"
1 "Q" "B"
1 "D" "M"
1 "D" "M"
1 "P" "E"
2 "A" "B"
2 "R" "P"
2 "A" "F"
3 "X" "U"
... ... ...
我想生成一个新的列,看起来像这样:
user feature1 feature2 new_rand
1 "A" "B" 0.183
1 "L" "L" 0.183
1 "Q" "B" 0.183
1 "D" "M" 0.183
1 "D" "M" 0.183
1 "P" "E" 0.183
2 "A" "B" 0.971
2 "R" "P" 0.971
2 "A" "F" 0.971
3 "X" "U" 0.302
... ... ...
我做的第一种方法基本上是使用 s <- split(df, df$user)
但是数据框包含大量用户,我认为这可能是一种非常低效的方法。
非常感谢。
最佳答案
@akrun 的方法是一个很好的一次性方法,但它没有利用向量化(我们在 user
的每个级别内重复调用一次 rnorm
),所以它是可能在缓慢的一面。更通用的方法是:
library(data.table)
setDT(df)
df[unique(df, by = "user")[ , new_rand := rnorm(.N)],
new_rand := i.new_rand, on = "user"]
这是怎么回事? unique
返回一个新的 data.table
,其中所有重复的观察结果(由 by
定义,此处为 user
)已删除;然后我们向这个新对象添加一列 ([, := ]
)。最后,这个扩充后的 data.table
被连接回原始表。
请注意,这里我们只调用一次 rnorm
,返回一个大小恰到好处的向量。然后我们将其加入原始数据集,根据需要将值“传播”到每个用户
的所有观察值。
或者分配给更具体的组,例如user
和feature1
和feature2
:
grps <- c("user", "feature1", "feature2")
df[unique(df, by = grps)[ , new_rand := rnorm(.N)],
new_rand := i.new_rand, on = grps]
关于r - 在 R 数据帧中生成随机数,这些随机数在相似行中保持不变,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33925270/