【发布时间】:2017-06-25 13:49:12
【问题描述】:
我尝试使用来自不同列 (Key2 - KeyX) 的值在 R 中扩展数据集,然后使用公式中的列号计算一些值。
我要扩展的部分数据集示例
Year Key2 Key3 Key4 Key5 ...
2001 150 105 140 140
2002 130 70 55 80
2003 590 375 355 385
...
首选结果。
- i = 索引号
- col = 列号(Key2 = 1,Key3 = 2 等)
- p = 随机数
-
value = 使用列号和 p 计算的值
year i col p value 2001 1 1 0.7481282 4.0150810 2001 2 1 0.8449366 2.0735090 2001 ... 1 0.1906882 0.9534411 2001 150 1 0.8030162 3.7406410 2001 1 2 0.4147019 4.2246831 2001 2 2 0.3716995 1.8584977 2001 ... 2 0.5280272 2.6401361 2001 105 2 0.8030162 3.7406410 2001 1 3 0.7651376 3.8256881 2001 2 3 0.2298984 1.1494923 2001 ... 3 0.5607825 2.8039128 2001 140 3 0.7222644 3.6113222 etc. 2002 1 1 0.1796613 0.8983065 2002 2 1 0.6390833 3.1954165 2002 ... 1 0.5280272 2.6401367 2002 130 1 0.4238842 2.1194210 2002 1 2 0.7651376 3.8256889 2002 2 2 0.2298984 1.1494928 2002 ... 2 0.5607825 2.8039125 2002 70 2 0.7222644 3.6113227 2002 1 3 0.7512801 3.7564000 2002 2 3 0.4484248 2.2421240 2002 ... 3 0.5662704 2.8313520 2002 55 3 0.7685377 3.8426884 etc.
我在 R 中使用以下代码,但是对于大型数据集,它非常慢。
我试图通过使用rep() 将循环的使用保持在最低限度,但我仍然需要在代码中进行循环。
R 有没有更快/更有效的方法来做到这一点?使用数据表?
val <- c(); i <- c(); cols <- c(); p <- c(); year <- c()
for (year in 1:10) {
for (n in 2:25) {
c <- n-1
pu <- runif(dataset1[[year, n]])
p <- c(p, pu )
tmp <- (c-1)*5 + 5*pu
val <- c(val, tmp)
##
i <- c(i, 1:dataset1[[year, n]])
cols <- c(cols, rep(c, dataset1[[year, n]]) )
year <- c(year, rep(dataset1[[year,1]], dataset1[[year, n]]) )
}
}
res.df <- data.frame(year=year, i=i, cols=cols, p=p, val=val)
res.df <- setDT(res.df)
【问题讨论】:
-
你真的需要向量化你的代码。您可以以矢量化方式轻松创建直到
p和value阶段的所有内容。例如library(data.table) ; res <- setorder(melt(setDT(DT), id = "Year", value = "i", variable = "col")[rep(1:.N, i)], Year, col)[, i := seq_len(.N), by = .(Year, col)]。我不明白您是如何创建p和value,但runif已矢量化,不要使用循环 以运行矢量化操作。如果你能解释你到底在做什么,你可以在一次调用中创建这两个列。 -
感谢
data.table的建议。比循环快得多。一些更多的背景信息。初始数据集中的值表示某个年龄组的人数,范围为 5 岁。 Key2:年龄0-5岁; Key3:年龄5-10岁;等等。使用公式,我尝试模拟每个类别中个人的年龄。 -
我也想添加这个问题,作为参考:stackoverflow.com/questions/40175658/… 如果没有更多可用的空行,您可以通过仅扩展 data.table 来加快一些计算。
-
@hannes101 我不认为这是一个好的欺骗目标。问题不是关于在 data.table 末尾添加行,而是创建一个更大的数据集,即上述 3 行最终扩展为 2575 行的新数据集,即增加了 900 倍。但是,使用
data.table的快速set()操作可能是其他答案的替代方法。如果您发布解决方案,我很乐意将其包含在我的基准测试中。
标签: r data.table dplyr