使用ifelse()条件语句改变多列R数据框中的值

5

我想用 ifelse() 条件语句创建多列数据。这是我的示例代码:

df <- tibble( 
date = lubridate::today() +0:9,
return= c(1,2.5,2,3,5,6.5,1,9,3,2))

现在我想添加新的列,并按从1到8的条件进行排序。第一列应该只包含“return”列中高于1的值,第二列应该只包含高于2的值,以此类推...

我可以使用mutate()函数计算每个列:

df <- df %>% mutate( `return>1`= ifelse(return > 1, return, NA))
df <- df %>% mutate( `return>2`= ifelse(return > 2, return, NA))
df <- df %>% mutate( `return>3`= ifelse(return > 3, return, NA))
df <- df %>% mutate( `return>4`= ifelse(return > 4, return, NA))
df <- df %>% mutate( `return>5`= ifelse(return > 5, return, NA))
df <- df %>% mutate( `return>6`= ifelse(return > 6, return, NA))
df <- df %>% mutate( `return>7`= ifelse(return > 7, return, NA))
df <- df %>% mutate( `return>8`= ifelse(return > 8, return, NA))


> head(df)
# A tibble: 6 x 10
date       return `return>1` `return>2` `return>3` `return>4` `return>5` `return>6` `return>7` `return>8`
<date>      <dbl>      <dbl>      <dbl>      <dbl>      <dbl>      <dbl>      <dbl>      <dbl>      <dbl>
1 2019-03-08    1         NA         NA         NA         NA         NA         NA           NA         NA
2 2019-03-09    2.5        2.5        2.5       NA         NA         NA         NA           NA         NA
3 2019-03-10    2          2         NA         NA         NA         NA         NA           NA         NA
4 2019-03-11    3          3          3         NA         NA         NA         NA           NA         NA
5 2019-03-12    5          5          5          5          5         NA         NA           NA         NA
6 2019-03-13    6.5        6.5        6.5        6.5        6.5        6.5        6.5         NA         NA

有没有更简单的方法来创建所有这些列并减少所有这些代码?也许可以使用map_function吗?是否有一种自动命名新列的方法?
3个回答

6
< p >使用lapply的选项
n <- seq(1, 8)
df[paste0("return > ", n)] <- lapply(n, function(x) 
                    replace(df$return, df$return <= x, NA))


#       date       return `return > 1` `return > 2` `return > 3` .....
#  <date>      <dbl>        <dbl>        <dbl>        <dbl> 
#1 2019-03-08    1           NA           NA           NA  
#2 2019-03-09    2.5          2.5          2.5         NA    
#3 2019-03-10    2            2           NA           NA    
#4 2019-03-11    3            3            3           NA    
#5 2019-03-12    5            5            5            5    
#6 2019-03-13    6.5          6.5          6.5          6.5  
#...

有没有办法添加小数点呢?例如:return>1;return>1.5;return>2;return>2.5 - TobKel
2
@T.Kel 更新了答案。现在对于小数,您可以将 n 更改为 n <- seq(1, 8, 0.5),它将起作用。 - Ronak Shah
Warning messages: 1: In 1:n : numerical expression has 7 elements: only the first used 2: In 1:n : numerical expression has 7 elements: only the first used - TobKel
请再次检查答案。我将“1:n”更改为仅“n”,因为现在“n”保存了序列,我们不需要执行“1:n”。 - Ronak Shah

3

这里是一个 for 循环的解决方案:

for(i in 1:8){
  varname =paste0("return>",i)
  df[[varname]] <- with(df, ifelse(return > i, return, NA))
}

3

使用 purrr::map_df

> bind_cols(df,purrr::map_df(setNames(1:8,paste0('return>',1:8)),
+               function(x) ifelse(df$return > x, df$return, NA)))
# A tibble: 6 x 10
#   date       return `return>1` `return>2` `return>3` `return>4` `return>5` `return>6` `return>7` `return>8`
#   <date>      <dbl>      <dbl>      <dbl>      <dbl>      <dbl>      <dbl>      <dbl>      <dbl>      <dbl>
# 1 2019-03-08    1         NA         NA         NA         NA         NA         NA           NA         NA
# 2 2019-03-09    2.5        2.5        2.5       NA         NA         NA         NA           NA         NA
# 3 2019-03-10    2          2         NA         NA         NA         NA         NA           NA         NA
# 4 2019-03-11    3          3          3         NA         NA         NA         NA           NA         NA
# 5 2019-03-12    5          5          5          5          5         NA         NA           NA         NA
# 6 2019-03-13    6.5        6.5        6.5        6.5        6.5        6.5        6.5         NA         NA

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接