我希望深入了解为何发生这种情况,以及我如何更有说服力地做到这一点。为什么sapply返回需要转置的矩阵,然后转置的矩阵不会附加到数据帧?
当我使用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 2010-11-10 03:20:36
@hadley:该示例遵循R发布准则,提供一个最小的可行示例。实际情况相当复杂,复杂性会削弱核心问题。我使用泰勒级数展开函数估计了20个不同参数的模型灵敏度,并接受了20x8数据帧作为输入。如果您愿意,我很乐意发送完整的可重复使用的示例,但尚未准备好公开。 – 2010-11-10 04:19:38
你需要在容易理解的东西和捕捉你正在努力解决的问题的本质之间寻找一个快乐的媒介。在你现在的例子中,似乎你想让'b'等于'a'。 – hadley 2010-11-10 13:50:24