将函数应用于data.frame的每一列并组织输出

将函数应用于data.frame的每一列并组织输出,r,function,dataframe,apply,sapply,R,Function,Dataframe,Apply,Sapply,我有这个向量: x <- c(5,2,-4,-6,-2,1,4,2,-3,-6,-1,8,9,5,-6,-11) 我想将此函数应用于data.frame: df <- data.frame(x <- c(5,2,-4,-6,-2,1,4,2,-3,-6,-1,8,9,5,-6,-11), y <- c(5,2,-4,-6,-2,1,4,2,-3,-6,-1,8,9,5,-6,-11), z &

我有这个向量:

 x <- c(5,2,-4,-6,-2,1,4,2,-3,-6,-1,8,9,5,-6,-11)
我想将此函数应用于data.frame:

df <- data.frame(x <- c(5,2,-4,-6,-2,1,4,2,-3,-6,-1,8,9,5,-6,-11),
                   y <- c(5,2,-4,-6,-2,1,4,2,-3,-6,-1,8,9,5,-6,-11),
                   z <- c(5,2,-4,-6,-2,1,4,2,-3,-6,-1,8,9,5,-6,-11))

df在这种情况下,您希望使用
lappy
。它将处理data.frame的每一列,因为它实际上是一个等长向量的列表,并分别返回两列data.frame

x <- lapply(df, myfunction)
之后,您可能希望再次将它们从列表组合到data.frame。您可以通过
do.call

df2 <- do.call(cbind, x)
旁注: 如果您没有data.frame,但有一个矩阵作为输入,另一个选项将是
apply
,其中with
MARGIN=2

x <- apply(df, MARGIN = 2, myfunction)

x请不要将
lappy
sapply
等同于
apply(…,MARGIN=2)
<代码>应用
用于矩阵,并应在适当时使用。我正在努力思考一个案例,当数据帧上需要使用
apply(df,MARGIN=2)
时,几乎总是应该使用
lapply
sapply
。我理解您的担忧。您希望将其从答案中删除,还是将其标记为一种可能但不方便的解决方案?我只是把它包括在内,因为它会导致期望的输出。如果这是我的答案,我会删除它。又好又简单。更好的办法是将它移到底部并进行解释。类似于“如果您有一个矩阵,而不是一个数据框,请使用
apply
。可以在一个数据框上使用
apply
,但它会首先将数据框转换为
matrix
,如果您有不同类型的列,这是有风险的,因此如果您有一个数据框,最好只使用
l/s/vapply
”但有更多的细节。可能链接到以获取更多信息。
outputs <- data.frame(sapply(df, myfunction))
x <- lapply(df, myfunction)
x <- sapply(df, myfunction)
df2 <- do.call(cbind, x)
names(df2) <- NULL
df2
# 1    5  0.0   5  0.0   5  0.0
# 2    2  0.0   2  0.0   2  0.0
# 3   -4 -4.0  -4 -4.0  -4 -4.0
# 4   -6 -8.5  -6 -8.5  -6 -8.5
# ....
x <- apply(df, MARGIN = 2, myfunction)