使用cbind将值附加到数据框

时间:2012-04-02 09:58:37

标签: r dataframe

我有一个名为glen的数据框,它有这种形式(这是它的一部分)

  X   Y  Z
 334 213 A  
 123 342 B  
 324 344 C  
 234 231 D  
 643 575 E

我正在对此数据应用一个函数,这将为Z多行的每个值生成。

for(i in 1:nrow(glen))
{
fin <-  cbind(fin,name=glen[i,]$Z, ...ETC)

}

因此fin的输出应该像:

Z V1 V2
A  5 6
A  1 4
A  4 2
A  8 6
B  2 7
B  5 4
C  2 4
C  9 5

但是在for循环结束后,我只有fin数据框的最后一个值:

C  2 4
C  9 5

如何填写fin数据框内的所有值。

谢谢

1 个答案:

答案 0 :(得分:1)

无法准确弄清楚你是如何从glen中的值到fin中的值(有人可以让我知道简单的映射我太慢了),这里是一个建议:

glen <- data.frame(X=c(334,123,324,234,643),Y=c(213,342,344,231,575),
  Z=c("A","B","C","D","E"))

finList <- apply(glen, 1, function(x) {
  myName <- x["Z"]
  myVal1 <- as.numeric(x["X"])-c(1:4)
  myVal2 <- 5:8
  return(data.frame(Z = rep(myName, length(myVal1)), V1 = myVal1, V2 = myVal2))
})

fin <- do.call("rbind", finList)

通常,避免在for循环中生成对象可能会很好,尤其是glen有很多行时。

此外,您cbind循环中for每次迭代的结果,但示例fin看起来您真的想要rbind

另外,2,glen$Z唯一的值是唯一的吗?

修改

apply中添加了一行,以显示基于glen的计算。 x中调用的匿名函数中的对象apply是传递给函数的glen部分。您甚至可以根据函数中的整个数据集glen执行计算,但了解您希望为每行执行的计算将非常有用。

编辑2

以下示例考虑了下面关​​于附加表df的注释:

df<-data.frame(begin=rep(glen$X,each=5),
  finish=glen$Y-sample(-10:10,5*nrow(glen),replace=TRUE),
  Val1=rnorm(5*nrow(glen)))

finList <- apply(glen, 1, function(x) {
  myName <- x["Z"]
  myVal1 <- subset(df, begin==x["X"]&finish<=x["Y"])$Val1
  return(data.frame(Z = rep(myName, length(myVal1)), V1 = myVal1))
})

fin <- do.call("rbind", finList)