我有一个我试图使用apply的矩阵,但是我的函数采用10x1矩阵,然后返回10x2矩阵(即calaculates 2 values for each inout value).我的整体矩阵是10x3所以当我使用apply()
我应该得到一个10x6矩阵,但是我不能得到apply()
添加更多的列,这是可能的apply()
?我的函数产生一个10x2,但是当我调用apply()
时,第二列被截断了。
data_matrix <- function(column) {
polynomial <- poly(column, degree=2, raw=TRUE)
return(polynomial)
}
poly_matrix <- apply(test_data, 2, data_matrix)
字符串
3条答案
按热度按时间q3aa05251#
让
apply
不要简化它的输出。这是通过将参数simplify
设置为FALSE
来调用它来完成的。另一种方法是直接使用
lapply
,但这仅在输入是 Dataframe 时才可能,如果输入数据是"matrix"
类,则必须使用apply
。字符串
创建于2023-11-11使用reprex v2.0.2
编辑
在更仔细地阅读文档之后,似乎
apply
的这种行为是一个设计决策。文档首先提到了返回向量的函数。引用自help("apply")
,Value部分,我的重点。如果每次调用
FUN
都返回一个长度为n
的vector,并且simplify
为TRUE,则如果n > 1
,则apply返回一个维度为c(n, dim(X)[MARGIN])
的数组。如果n
等于1,则如果MARGIN
的长度为1,则apply返回一个向量,否则返回一个维度为dim(X)[MARGIN]
的数组。如果n
为0,结果的长度为0,但不一定是“正确的”尺寸。然后,在最后一段中,我强调:
在所有情况下,在设置维度之前,结果都被
as.vector
**强制转换为一种基本向量类型,因此(例如)因子结果将被强制转换为字符数组。这解释了为什么使用默认值
simplify = TRUE
的调用返回一个矩阵,其中dim[1L]
是输入向量长度的两倍。如果它是原子模式,则所有属性都将从结果中删除as.vector
。数值矩阵就是这种情况,它们是具有dim
属性的原子向量,因此被删除,变成向量ncol
乘以长度(在问题的情况下是两倍)。iswrvxsc2#
如果你使用
sapply
,你可以简单地通过旧尺寸乘以c(1, deg)
来重新排列array
。字符串
Package 成函数
型
请注意,
apply
是为矩阵设计的,与lapply; sapply; vapply
相反,对于 Dataframe 来说速度较慢。型
yr9zkbsy3#
有了商定的数据,我会把这个放在未来,以提醒自己在所有 Package 之前发生了什么
字符串
数据
型
我认为上面的答案很棒,但是掩盖了poly所做的接近你想要的结果(额外的,不想要的输出),提供了一个从输出中选择想要的结果的机会。一年后回到这个问题,我可能无法回忆起poly正在做繁重的工作。