我有一个名为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
数据框内的所有值。
谢谢
答案 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)