PDi*_*lta 3 element r apply dataframe
更新:之前,我使用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)
Run Code Online (Sandbox Code Playgroud)
我完全不知道无法在互联网上的任何地方找到这个问题的答案.大多数资源谈apply,lapply和sapply但那些只工作在矢量/列表和它们只返回列表.
for循环真的是唯一的方法吗?
df <- data.frame(c(1,2,3), c(2,3,4))
df[] <- lapply(df, function(x) paste(x,"x", sep=""))
df
Run Code Online (Sandbox Code Playgroud)
df[] 保留数据帧的结构.
小智 6
不能用apply(df, c(1,2), myFun)吗?使用c(1,2)会将函数分别应用于数据框中的每个项目:
MARGIN 一个向量,给出函数将被应用的下标。例如,对于矩阵,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"
Run Code Online (Sandbox Code Playgroud)
如果按行应用该函数,则该函数未正确使用:
> apply(temp, 1, function(x) {gsub('d',x,'d1d1')})
[1] "A1A1" "B1B1" "C1C1"
Warning messages:
1: In gsub("d", x, "d1d1") :
argument 'replacement' has length > 1 and only the first element will be used
2: In gsub("d", x, "d1d1") :
argument 'replacement' has length > 1 and only the first element will be used
3: In gsub("d", x, "d1d1") :
argument 'replacement' has length > 1 and only the first element will be used
Run Code Online (Sandbox Code Playgroud)
我们既可以使用mutate_all从dplyr
library(dplyr)
df %>%
mutate_all(funs(paste0(., "x")))
Run Code Online (Sandbox Code Playgroud)
或者使用lapplyfrom base R并将其转换为data.frame
data.frame(lapply(df, paste0, "x"))
Run Code Online (Sandbox Code Playgroud)