将函数应用于data.frame中的每个元素并返回data.frame

时间:2018-02-07 11:05:09

标签: r dataframe element apply

更新:之前,我使用paste函数作为示例而不是任意myFun函数。这个问题稍微容易一些,因为paste实际上可以对向量进行操作,而myFun则不能。

我想将自己的函数元素应用于data.frame中的每个元素,并将修改后的data.frame作为返回值。

示例:

> df <- data.frame(c(1,2,3), c(2,3,4))
> df
  c.1..2..3. c.2..3..4.
1          1          2
2          2          3
3          3          4
> df_x <- magical_apply_function(df, function(x) myFun
> df_x
  c.1..2..3. c.2..3..4.
1         myFun(1)         myFun(2)
2         myFun(2)         myFun(3)
3         myFun(3)         myFun(4)

我完全不知道无法在互联网上的任何地方找到这个问题的答案。大多数资源都会讨论applylapplysapply,但这些资源仅适用于向量/列表,并且只返回列表。

for循环真的是唯一的方法吗?

4 个答案:

答案 0 :(得分:5)

我们可以使用mutate_all

中的dplyr
library(dplyr)
df %>% 
     mutate_all(funs(paste0(., "x")))

lapply来自base R并将其转换为data.frame

data.frame(lapply(df, paste0,  "x"))

答案 1 :(得分:5)

df <- data.frame(c(1,2,3), c(2,3,4))
df[] <- lapply(df, function(x) paste(x,"x", sep=""))
df

df[]保留了数据帧的结构。

答案 2 :(得分:3)

另请参阅这些purrr函数

library(purrr)
modify(df,paste0,"x") # output is of the same type input, so `data.frame` here

#   c.1..2..3. c.2..3..4.
# 1         1x         2x
# 2         2x         3x
# 3         3x         4x

map_df(df,paste0,"x") # output is always tibble

# # A tibble: 3 x 2
#   c.1..2..3. c.2..3..4.
#        <chr>      <chr>
# 1         1x         2x
# 2         2x         3x
# 3         3x         4x

答案 3 :(得分:1)

您不能使用... "editor.formatOnSave": true, "editor.codeActionsOnSave": { "source.organizeImports": true } .... 吗?使用apply(df, c(1,2), myFun)会将功能分别应用于数据框中的每个项目:

  

MARGIN一个给出下标的向量,该功能将被应用到下标。例如,对于矩阵,1表示行,2表示列,c(1,2)表示行和列。

c(1,2)

如果按行应用该函数,则该函数使用不正确:

> temp<-data.frame(le=LETTERS[1:3], nu=20:22)
> temp
  le nu
1  A 20
2  B 21
3  C 22
> apply(temp, c(1,2), function(x) {gsub('d',x,'d1d1')})
     le     nu      
[1,] "A1A1" "201201"
[2,] "B1B1" "211211"
[3,] "C1C1" "221221"