【发布时间】:2011-05-07 14:58:20
【问题描述】:
我希望能深入了解为什么会发生这种情况,以及如何才能更有说服力地做到这一点。
当我使用 sapply 时,我希望它返回一个 3x2 矩阵,但它返回一个 2x3 矩阵。为什么是这样?为什么很难将它附加到另一个数据框?
a <- data.frame(id=c('a','b','c'), var1 = c(1,2,3), var2 = c(3,2,1))
out <- sapply(a$id, function(x) out = a[x, c('var1', 'var2')])
#out is 3x2, but I would like it to be 2x3
#I then want to append t(out) (out as a 2x3 matrix) to b, a 1x3 dataframe
b <- data.frame(var3=c(0,0,0))
当我尝试附加这些时,
b[,c('col2','col3')] <- t(out)
我得到的错误是:
Warning message:
In `[<-.data.frame`(`*tmp*`, , c("col2", "col3"), value = list(1, :
provided 6 variables to replace 2 variables
虽然以下似乎给出了预期的结果:
rownames(out) <- c('col1', 'col2')
b <- cbind(b, t(out))
我无法对变量进行操作:
b$var1/b$var2
返回
Error in b$var1/b$var2 : non-numeric argument to binary operator
谢谢!
【问题讨论】:
-
你想用这些数据做什么?你的例子并没有真正做任何有意义的事情。
-
@hadley:该示例遵循 R 发布指南,提供了一个最小的、可行的示例。实际情况相当复杂,复杂性会偏离中心问题。我的函数使用泰勒级数展开估计模型对 20 个不同参数的敏感性,并接受 20x8 数据帧作为输入。如果您愿意,我很乐意发送一个完整的可重现示例,尽管它尚未准备好公开。
-
您需要在易于理解的事物和抓住您正在努力解决的问题的本质之间寻求一种快乐的媒介。在您当前的示例中,您似乎正在尝试使
b等于a。 -
@hadley:谢谢你的提示,我会记住的。
标签: r data-structures vectorization apply