r - 在 R 数据帧中生成随机数,这些随机数在相似行中保持不变

标签 r dataframe split-apply-combine

我有一个包含每个“用户”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,返回一个大小恰到好处的向量。然后我们将其加入原始数据集,根据需要将值“传播”到每个用户的所有观察值。

或者分配给更具体的组,例如userfeature1feature2:

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/

相关文章:

带有条件面板和 react 器的 R Shiny 模块

r - 在R中快速替换数据框中的值

pandas - matplotlib Pandas : Change width between datapoints based on another columns value

python - 将两列数据框转换为多索引系列

r - 在 R data.table 中粘贴多列对的有效方法

r - 如何在 knit/Rstudio 的 HTML 输出中添加目录

javascript - Highcharter/Highmap : change legend label format for billions

python - 如何用饼图绘制分类变量

r - 拆分、应用和合并 2 列数据