R将数据帧转换为可迭代列表

时间:2015-09-16 09:13:22

标签: r

虚拟数据:

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$meand$sd实际上是字符,而对rnorm的调用失败。我可以使用as.numeric轻松解决这个问题,但我真正想要的是修复函数​​iterator,以便示例用法成功而不会将值转换为字符。欢迎任何想法,并提前感谢!

1 个答案:

答案 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