将函数应用于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
,其中withMARGIN=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)