首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在map函数中使用条件变异多个列

在map函数中使用条件变异多个列
EN

Stack Overflow用户
提问于 2019-03-09 17:09:20
回答 1查看 61关注 0票数 0

我想用ifelse()-condition为多个数据帧创建几个列。下面是我的示例代码:

代码语言:javascript
复制
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的“-column”返回值,第二列应该只包含大于1.5的值,第三列应该只包含大于2的值,依此类推……

例如,我可以使用For循环来做这件事。但这只适用于一个数据帧:

代码语言:javascript
复制
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>

下面是为一个数据帧获取所需输出的另一个代码:

代码语言:javascript
复制
n <- seq(0.5, 5, 0.5)
df1[paste0("return > ", n, " sd")] <- lapply(n, function(x) 
replace(df1$return, df1$return <= x, NA))

我的问题是,如何将此代码放入map-function (或另一个函数)中,以便为所有3个数据帧运行此代码?

EN

回答 1

Stack Overflow用户

发布于 2019-03-09 17:31:55

将所有数据帧放在一个列表中,并创建一个函数来返回新列

代码语言:javascript
复制
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函数应用于列表中的每个数据帧

代码语言:javascript
复制
lapply(df_list, return_new_cols)

你可以用purrr::map代替lapply来实现同样的效果

代码语言:javascript
复制
purrr::map(df_list, return_new_cols)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55075730

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档