虚拟数据:
nTargets <- 3
df.1 <- data.frame(
label = paste0('l', 1:nTargets),
mean = runif(nTargets,1,10),
sd = runif(nTargets,1,3))
> targets
label mean sd
1 l1 3.458993 1.708791
2 l2 6.750544 1.662369
3 l3 5.776566 1.627535
我想要一个将帧转换为列名数组的函数,其中包含列名称给出的字段。
我试过了:
iterator <- function(df){
apply( df , 1 , function(f){ as.list(f) } )
}
使用示例,
df.2 <- NULL # storage
nSamples <- 5
for(d in iterator(df.1)){
df.2 <- rbind(df.2, data.frame(label=d$label, value=rnorm(nSamples, d$mean, d$sd)))
}
上述问题是我的函数iterator
将其转换为矩阵,意味着d$mean
和d$sd
实际上是字符,而对rnorm
的调用失败。我可以使用as.numeric
轻松解决这个问题,但我真正想要的是修复函数iterator
,以便示例用法成功而不会将值转换为字符。欢迎任何想法,并提前感谢!
答案 0 :(得分:1)
正如评论中所指出的,您可以使用split()
来完成您正在寻找的内容:
split(df, seq_len(ncol(df)))
以下是使用data.table
执行此操作的另一种方法:
library(data.table)
DT = setDT(df.1)
DT[,rnorm(nSamples, mean, sd), by=label]
split(result, result$label)
结果:
$l1
label V1
1: l1 0.2374258
2: l1 4.3223959
3: l1 6.8198647
4: l1 2.9070670
5: l1 5.9078326
$l2
label V1
1: l2 9.182992
2: l2 4.083746
3: l2 8.899143
4: l2 9.118341
5: l2 2.515886
$l3
label V1
1: l3 6.414309
2: l3 7.162507
3: l3 7.024702
4: l3 8.071417
5: l3 7.673151