R dataframe使用/ / all_of / mutate_if从现有列中创建多个新列

托马斯·菲利普斯

我有一个数据框(下面的示例),该数据框在多天内对问卷进行了回复。

        > df %>% 
            mutate (Sigma_Bucket_Q1  = if_else(Sigma_Q1 >= Median_Sigma_Q1, 
                    "Above Median Volatility", "Below Median Volatility"))
    # A tibble: 19 x 12
       UserId Days_From_First_Use    Q1    Q2    Q3 Sigma_Q1 Sigma_Q2 Sigma_Q3 Median_Sigma_Q1 Median_Sigma_Q2 Median_Sigma_Q3 Sigma_Bucket_Q1        
       <fct>                <int> <int> <int> <int>    <dbl>    <dbl>    <dbl>           <dbl>           <dbl>           <dbl> <chr>                  
     1 A                        0     3     2     1     1.10    0.837    0.548            1.45            1.59            1.53 Below Median Volatility
     2 A                        1     1     0     0     1.10    0.837    0.548            1.45            1.59            1.53 Below Median Volatility
     3 A                        2     1     1     0     1.10    0.837    0.548            1.45            1.59            1.53 Below Median Volatility
     4 A                        3     0     2     0     1.10    0.837    0.548            1.45            1.59            1.53 Below Median Volatility
     5 A                        4     1     1     1     1.10    0.837    0.548            1.45            1.59            1.53 Below Median Volatility
     6 B                        0     4     8     2     1.26    2.5      2.06             1.45            1.59            1.53 Below Median Volatility
     7 B                        2     2     2     1     1.26    2.5      2.06             1.45            1.59            1.53 Below Median Volatility
     8 B                        4     5     6     5     1.26    2.5      2.06             1.45            1.59            1.53 Below Median Volatility
     9 B                        5     4     5     5     1.26    2.5      2.06             1.45            1.59            1.53 Below Median Volatility
    10 C                        0     5     7     2     1.64    1.87     1                1.45            1.59            1.53 Above Median Volatility
    11 C                        1     2     2     2     1.64    1.87     1                1.45            1.59            1.53 Above Median Volatility
    12 C                        2     5     5     4     1.64    1.87     1                1.45            1.59            1.53 Above Median Volatility
    13 C                        3     6     5     3     1.64    1.87     1                1.45            1.59            1.53 Above Median Volatility
    14 C                        4     6     6     4     1.64    1.87     1                1.45            1.59            1.53 Above Median Volatility
    15 D                        0     5     3     5     2.35    1.30     2.30             1.45            1.59            1.53 Above Median Volatility
    16 D                        1     5     3     4     2.35    1.30     2.30             1.45            1.59            1.53 Above Median Volatility
    17 D                        2     4     2     6     2.35    1.30     2.30             1.45            1.59            1.53 Above Median Volatility
    18 D                        3     0     0     1     2.35    1.30     2.30             1.45            1.59            1.53 Above Median Volatility
    19 D                        4     1     1     1     2.35    1.30     2.30             1.45            1.59            1.53 Above Median Volatility

Q1Q2Q3有反应,而Sigma_Q1Sigma_Q2Sigma Q3有时间系列中的每个对象针对每个问题提供响应的标准偏差。Median_Sigma_1Median_Sigma_2以及Median_Sigma_3具有跨学科他们对反应的中位数标准偏差Q1Q2Q3我想根据是否将每个主题分类为“高于中位数”或“低于中位数波动”主题Sigma_Q1 > Median_Sigma_Q1我的表达Sigma_Bucket_Q1效果很好。它可以在小标题之前看到。

但是,当我尝试将其概括为同时生成所有Sigma_Bucket时(我的实际问题有21个这样的名称),我遇到了一个问题。我试过了:

        df %>% 
  mutate (across(all_of(paste0("Sigma_Bucket_", c("Q1", "Q2", "Q3")) = if_else(paste0("Sigma_", {.col}) >= paste0("Median_Sigma_",  {.col}), 
          "Above Median Volatility", "Below Median Volatility")))

我收到一条神秘的错误消息,无法确定需要解决的问题:

> df %>% 
+   mutate (across(all_of(paste0("Sigma_Bucket_", c("Q1", "Q2", "Q3")) = if_else(paste0("Sigma_", {.col}) >= paste0("Median_Sigma_",  {.col}), 
Error: unexpected '=' in:
"df %>% 
  mutate (across(all_of(paste0("Sigma_Bucket_", c("Q1", "Q2", "Q3")) ="
>           "Above Median Volatility", "Below Median Volatility")))
Error: unexpected ',' in "          "Above Median Volatility","

如何修改我的陈述以执行所有3列(实际问题中全部21列)而不必为每个问题写一行?

浏览关于StackOverflow的各种答案表明,这mutate_if可能是解决方案的基础,但是我不知道如何在此特定设置中使用它。

在此先感谢您的协助

托马斯·菲利普斯

andrew_reece

这是使用的解决方案map

map2_df(
    df %>% select(starts_with("Sigma_Q")), 
    df %>% select(starts_with("Median_Sigma_Q")),
    ~if_else(.x >= .y, "Above Median Volatility", "Below Median Volatility")) %>%
  rename_with(~str_replace(.x, "Sigma", "Sigma_Bucket"))

输出:

# A tibble: 19 x 3
   Sigma_Bucket_Q1         Sigma_Bucket_Q2         Sigma_Bucket_Q3        
   <chr>                   <chr>                   <chr>                  
 1 Below Median Volatility Below Median Volatility Below Median Volatility
 2 Below Median Volatility Below Median Volatility Below Median Volatility
 3 Below Median Volatility Below Median Volatility Below Median Volatility
 4 Below Median Volatility Below Median Volatility Below Median Volatility
 5 Below Median Volatility Below Median Volatility Below Median Volatility
 6 Below Median Volatility Above Median Volatility Above Median Volatility
 7 Below Median Volatility Above Median Volatility Above Median Volatility
 8 Below Median Volatility Above Median Volatility Above Median Volatility
 9 Below Median Volatility Above Median Volatility Above Median Volatility
10 Above Median Volatility Above Median Volatility Below Median Volatility
11 Above Median Volatility Above Median Volatility Below Median Volatility
12 Above Median Volatility Above Median Volatility Below Median Volatility
13 Above Median Volatility Above Median Volatility Below Median Volatility
14 Above Median Volatility Above Median Volatility Below Median Volatility
15 Above Median Volatility Below Median Volatility Above Median Volatility
16 Above Median Volatility Below Median Volatility Above Median Volatility
17 Above Median Volatility Below Median Volatility Above Median Volatility
18 Above Median Volatility Below Median Volatility Above Median Volatility
19 Above Median Volatility Below Median Volatility Above Median Volatility

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

使用模板元编程实现std :: all_of的静态版本?

使用dplyr mutate和现有列的子字符串创建新列

使用DOMDocument在现有HTML表中创建新列

如何使用现有数据在R中填充新列?

使用ifelse在r中创建新列

使用R中的循环在现有数据框中创建列

R-使用条件语句创建多个新列

在R中的dplyr中使用mutate函数创建一个具有日期值(2000-05-06)的新列

使用mutate_all创建新列

将all_of与lambda函数集合一起使用?

使用mutate_at使用数据框中的其他多个列创建新列

在std :: map中使用std :: any_of,std :: all_of,std :: none_of等

根据R中的现有列创建新列

使用R中现有列的前3个字母创建一个可用作主键的列

为什么要使用“ all_of”选择列?

Mutate(across(all_of()))自定义函数错误

使用 R,如何使用现有数据框中列的中位数创建新数据集?

从 R 中具有不同值的现有列创建新列

使用 Spark Scala Dataframe 中的现有整数列创建具有整数范围的新列

如何使用现有列的条件在 Dataframe 中创建新列?

tidymodels 配方:使用 all_of 选择存储在向量中的变量

如何在 R 的数据框中添加新列并使用现有列?

R:将字符向量传递给 dplyr::all_of() 的预期输出是什么?

是否有用于使用现有数据帧中的两列创建新数据帧的 R 函数?

从 R 中的现有列值创建新列(使用其他列作为键)

在 R 中使用具有多个结果的函数在 mutate 中创建多个列

是否可以在数据框中创建一个新列,该列是在 R 中使用 mutate 的函数的输出?

R:使用现有值创建一个新列,以另一列的组为条件

在 R 中使用 mutate() 和 cross() 创建多个新列