我想创建固定length 8
以下是示例数据:
x <- data.frame(id=c(1,1,1,2,2,3,3,3,3,4,4), year=c(2001,2001,2001,2010,2010,2002,2002,2002,2002,2005,2005),x=seq(0,0.1,0.01))
我的尝试:
x$new.id <- ave(x$id, x$year, FUN = function(x) rnorm(x,90000000,100000))
对于给定的id's
和id
year
必须有简单的解决方案,但我找不到一个。感谢。
编辑:或者如何为给定的行数创建新的8 digit id
。
所需的输出:the column new.id should be class character
new.id year new.id
1 1 2001 89957391
2 1 2001 89957391
3 1 2001 89957391
4 2 2010 90331214
5 2 2010 90331214
6 3 2002 89995435
7 3 2002 89995435
8 3 2002 89995435
9 3 2002 89995435
10 4 2005 90058279
11 4 2005 90058279
答案 0 :(得分:2)
您与编码方法非常接近(以这种方式使用ave
),但如果您想为每个组仅生成一个值,则应通过{{1进入1
s rnorm
参数。
我在这里看到的最大问题是,您希望生成一个随机数的类n
(然后转换为integer
类),而character
返回{{1根据定义。
所以你可能会这样做(使用rnorm
或double
或round
)
floor
但在我看来,更合适的方法是使用ceiling
代替
transform(x, new.id = ave(id,
year,
FUN = function(x) as.character(round(rnorm(1, 9e7, 1e5)))))
编辑:现在我开始考虑更多内容了,对于足够大的数据集,您可能会重复sample
因为您独立调用{ {1}}每次都有功能。在我看来,最好的解决方案是首先创建一个数据集,每个indx <- 1e7:(1e8 - 1)
transform(x, new.id = ave(id, year, FUN = function(x) as.character(sample(indx, 1))))
生成一个新索引,同时由单个new.id
调用生成,然后将其合并回数据集。使用sample
包可以最好地完成此操作(因为它有效连接并且只能在连接时添加单个列),类似下面的内容应该可以正常工作
id
这将通过引用更新原始数据集(无需sample
分配)。您只需执行data.table
即可转换回library(data.table)
y <- data.table(id = unique(x$id),
new.id = as.character(sample(indx, length(unique(x$id)))))
setkey(setDT(x), id) ; setkey(y, id)
x[y, new.id := i.new.id]
(如果您愿意)。