环境问题
environment issue
e <<- data.env ## here i am storing my rdata
data_frames <- Filter(function(x) is.data.frame(get(x)), ls(envir = e)) ## getting only dataframe
for(i in data_frames) e[[i]] <<- mytest_function(e[[i]]) ### here i am iterating the dataframe
现在,如何将 for 循环转换为应用函数?循环需要很长时间才能迭代。
不清楚您想要的结果是什么。但是,如果您只想对数据框中的每一列应用一个函数,那么您可以只使用 sapply
.
sapply(df, function(x) mytest_function(x))
或者您可以使用 purrr
包。
purrr::map(df, function(x) mytest_function(x)) %>%
as.data.frame
如果您有一个数据帧列表并且正在对每个数据帧应用一个函数,那么您也可以使用 purrr
。
library(purrr)
purrr::map(data_frames, mytest_function)
当你想将循环转换为应用函数时,我通常选择 lapply 但这取决于情况:
my_f <- function(x) {
mytest_function(e[[x]])
}
my_var <- lapply(1:length(data_frames), my_f)
好的,这里有一些基本的演示,我认为使用 apply 是一个很好的调用,特别是因为循环等环境问题。
# lets create some data.frames
df1 <- data.frame(x = LETTERS[1:3], y = rep(1:3))
df2 <- data.frame(x = LETTERS[4:6], y = rep(4:6))
# what df's are we going to "loop" over
data_frames <- c("df1", "df2")
# just some simple function to paste x and y from your df's to a new column z
mytest_function <- function(x) {
df <- get(x)
df$z <- paste(df$x, df$y)
df
}
# apply over your df's and call your function for every df
e <- lapply(data_frames, mytest_function)
# note that e will be a list with data.frames
e
[[1]]
x y z
1 A 1 A 1
2 B 2 B 2
3 C 3 C 3
[[2]]
x y z
1 D 4 D 4
2 E 5 E 5
3 F 6 F 6
# most of the time you want them combined
e <- do.call(rbind, e)
e
x y z
1 A 1 A 1
2 B 2 B 2
3 C 3 C 3
4 D 4 D 4
5 E 5 E 5
6 F 6 F 6
e <<- data.env ## here i am storing my rdata
data_frames <- Filter(function(x) is.data.frame(get(x)), ls(envir = e)) ## getting only dataframe
for(i in data_frames) e[[i]] <<- mytest_function(e[[i]]) ### here i am iterating the dataframe
现在,如何将 for 循环转换为应用函数?循环需要很长时间才能迭代。
不清楚您想要的结果是什么。但是,如果您只想对数据框中的每一列应用一个函数,那么您可以只使用 sapply
.
sapply(df, function(x) mytest_function(x))
或者您可以使用 purrr
包。
purrr::map(df, function(x) mytest_function(x)) %>%
as.data.frame
如果您有一个数据帧列表并且正在对每个数据帧应用一个函数,那么您也可以使用 purrr
。
library(purrr)
purrr::map(data_frames, mytest_function)
当你想将循环转换为应用函数时,我通常选择 lapply 但这取决于情况:
my_f <- function(x) {
mytest_function(e[[x]])
}
my_var <- lapply(1:length(data_frames), my_f)
好的,这里有一些基本的演示,我认为使用 apply 是一个很好的调用,特别是因为循环等环境问题。
# lets create some data.frames
df1 <- data.frame(x = LETTERS[1:3], y = rep(1:3))
df2 <- data.frame(x = LETTERS[4:6], y = rep(4:6))
# what df's are we going to "loop" over
data_frames <- c("df1", "df2")
# just some simple function to paste x and y from your df's to a new column z
mytest_function <- function(x) {
df <- get(x)
df$z <- paste(df$x, df$y)
df
}
# apply over your df's and call your function for every df
e <- lapply(data_frames, mytest_function)
# note that e will be a list with data.frames
e
[[1]]
x y z
1 A 1 A 1
2 B 2 B 2
3 C 3 C 3
[[2]]
x y z
1 D 4 D 4
2 E 5 E 5
3 F 6 F 6
# most of the time you want them combined
e <- do.call(rbind, e)
e
x y z
1 A 1 A 1
2 B 2 B 2
3 C 3 C 3
4 D 4 D 4
5 E 5 E 5
6 F 6 F 6