我想为多个数据框创建一个具有ifelse()条件的列。这是我的示例代码:
df1 <- tibble(
date = lubridate::today() +0:9,
return= runif(n = 10, min = 0, max = 5))
df2 <- tibble(
date = lubridate::today() +0:9,
return= runif(n = 10, min = 0, max = 5))
df3 <- tibble(
date = lubridate::today() +0:9,
return= runif(n = 10, min = 0, max = 5))
现在我想添加条件递增(从1到5)的新列。第一列应仅包含来自“返回”列的值,该值大于1,第二列应仅包含值,其值大于1.5,第三列应仅包含值,其值大于2,并且等等...
例如,我可以使用for循环来实现。但这仅适用于一个数据帧:
for(i in seq(1, 5, 0.5)){
varname =paste0("return>",i)
df1[[varname]] <- with(df1, ifelse(return > i, return, NA))
}
> head(df1)
# A tibble: 6 x 12
date return `return > 0.5 s~ `return > 1 sd` `return > 1.5 s~ `return > 2 sd` `return > 2.5 s~
<date> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 2019-03-09 4.94 4.94 4.94 4.94 4.94 4.94
2 2019-03-10 0.936 0.936 NA NA NA NA
3 2019-03-11 0.770 0.770 NA NA NA NA
4 2019-03-12 1.03 1.03 1.03 NA NA NA
5 2019-03-13 3.34 3.34 3.34 3.34 3.34 3.34
6 2019-03-14 0.983 0.983 NA NA NA NA
# ... with 5 more variables: `return > 3 sd` <dbl>, `return > 3.5 sd` <dbl>, `return > 4 sd` <dbl>,
# `return > 4.5 sd` <dbl>, `return > 5 sd` <dbl>
这是另一种代码,用于为一个数据帧获得所需的输出:
n <- seq(0.5, 5, 0.5)
df1[paste0("return > ", n, " sd")] <- lapply(n, function(x)
replace(df1$return, df1$return <= x, NA))
我的问题是,如何将该代码放入map函数(或另一个函数)中,以针对所有3个数据帧运行此代码?
答案 0 :(得分:0)
将所有数据框放入列表中,并创建一个函数以返回新列
df_list <- list(df1, df2, df3)
return_new_cols <- function(df1) {
n <- seq(0.5, 5, 0.5)
df1[paste0("return > ", n, " sd")] <- lapply(n, function(x)
replace(df1$return, df1$return <= x, NA))
df1
}
现在将return_new_cols
函数应用于列表中的每个数据框
lapply(df_list, return_new_cols)
您可以使用purrr::map
代替lapply
purrr::map(df_list, return_new_cols)