【问题标题】:R mutate_at on a subset of rowsR mutate_at 在行子集上
【发布时间】:2020-05-23 13:39:11
【问题描述】:

我的问题与这篇文章(Applying mutate_at conditionally to specific rows in a dataframe in R)类似,我可以重现结果。但是,当我尝试将其应用于我的问题时,即在选定行和列的单元格值上加上括号时,我遇到了错误消息。这是一个可重现的示例。

df <- structure(list(dep = c("cyl", "cyl", "disp", "disp", "drat", 
"drat", "hp", "hp", "mpg", "mpg"), name = c("estimate", "t_stat", 
"estimate", "t_stat", "estimate", "t_stat", "estimate", "t_stat", 
"estimate", "t_stat"), dat1 = c(1.151, 6.686, 102.902, 12.107, 
-0.422, -5.237, 37.576, 5.067, -5.057, -8.185), dat2 = c(1.274, 
8.423, 106.429, 12.148, -0.394, -5.304, 38.643, 6.172, -4.843, 
-10.622), dat3 = c(1.078, 5.191, 103.687, 7.79, -0.194, -2.629, 
36.777, 4.842, -4.539, -7.91)), row.names = c(NA, -10L), class = c("tbl_df", 
"tbl", "data.frame"))  

鉴于上面的数据框,我希望在name == t_stat 时,将dat1dat2dat3 列的单元格值加上括号。这是我尝试过的,但在这种情况下,case_when 函数内部似乎不接受 paste0

require(tidyverse)
df %>% mutate_at(vars(matches("dat")), 
+                  funs( case_when(name == 't_stat' ~ paste0("(", ., ")"), TRUE ~ .) )) 
Error: must be a character vector, not a double vector

当我使用蛮力,即改变每一列时,它可以工作,但我的实际问题有超过 10 列,所以这并不实用。

require(tidyverse)
> df %>%   mutate(dat1 = ifelse(name == "t_stat", paste0("(", dat1, ")"), dat1),
+                 dat2 = ifelse(name == "t_stat", paste0("(", dat2, ")"), dat1),
+                 dat3 = ifelse(name == "t_stat", paste0("(", dat3, ")"), dat1))
# A tibble: 10 x 5
   dep   name     dat1     dat2      dat3    
   <chr> <chr>    <chr>    <chr>     <chr>   
 1 cyl   estimate 1.151    1.151     1.151   
 2 cyl   t_stat   (6.686)  (8.423)   (5.191) 
 3 disp  estimate 102.902  102.902   102.902 
 4 disp  t_stat   (12.107) (12.148)  (7.79)  
 5 drat  estimate -0.422   -0.422    -0.422  
 6 drat  t_stat   (-5.237) (-5.304)  (-2.629)
 7 hp    estimate 37.576   37.576    37.576  
 8 hp    t_stat   (5.067)  (6.172)   (4.842) 
 9 mpg   estimate -5.057   -5.057    -5.057  
10 mpg   t_stat   (-8.185) (-10.622) (-7.91)

【问题讨论】:

    标签: r tidyverse


    【解决方案1】:

    case_when 是类型严格的,这意味着它期望输出属于同一类。您的原始列是数字类型,而在您的数据周围添加 "(" 时,您正在使其具有类字符。

    此外,funs 早已被弃用,mutate_at 很快将被 across 取代。

    library(dplyr)
    df %>% 
        mutate_at(vars(matches("dat")), 
          ~case_when(name == 't_stat' ~ paste0("(", ., ")"), TRUE ~ as.character(.)))
    

    【讨论】:

      【解决方案2】:

      错误信息......没有帮助。

      您的问题是您在列中混合了数字和字符数据。 dat 变量是数字。

      df %>% mutate_at(vars(matches("dat")), 
                       funs( case_when(name == 't_stat' ~ paste0("(", ., ")"),
                                       TRUE ~ as.character(.))))
      
      # A tibble: 10 x 5
         dep   name     dat1     dat2      dat3    
         <chr> <chr>    <chr>    <chr>     <chr>   
       1 cyl   estimate 1.151    1.274     1.078   
       2 cyl   t_stat   (6.686)  (8.423)   (5.191) 
       3 disp  estimate 102.902  106.429   103.687 
       4 disp  t_stat   (12.107) (12.148)  (7.79)  
       5 drat  estimate -0.422   -0.394    -0.194  
       6 drat  t_stat   (-5.237) (-5.304)  (-2.629)
       7 hp    estimate 37.576   38.643    36.777  
       8 hp    t_stat   (5.067)  (6.172)   (4.842) 
       9 mpg   estimate -5.057   -4.843    -4.539  
      10 mpg   t_stat   (-8.185) (-10.622) (-7.91) 
      

      【讨论】:

        【解决方案3】:

        基本上,您需要先将dbl 转换为char,这也是错误消息中所说的Error: must be a character vector, not a double vector

        正如@Rohan 所说,case_when 是类型严格的,这意味着它期望输出属于同一类。

        df %>% mutate_at(vars(matches("dat")),
                         ~case_when(name =='t_stat'~ paste0("(",as.character(.x),")"),
                                    T ~ as.character(.x))
                         )
        

        输出为

        # A tibble: 10 x 5
           dep   name     dat1     dat2      dat3    
           <chr> <chr>    <chr>    <chr>     <chr>   
         1 cyl   estimate 1.151    1.274     1.078   
         2 cyl   t_stat   (6.686)  (8.423)   (5.191) 
         3 disp  estimate 102.902  106.429   103.687 
         4 disp  t_stat   (12.107) (12.148)  (7.79)  
         5 drat  estimate -0.422   -0.394    -0.194  
         6 drat  t_stat   (-5.237) (-5.304)  (-2.629)
         7 hp    estimate 37.576   38.643    36.777  
         8 hp    t_stat   (5.067)  (6.172)   (4.842) 
         9 mpg   estimate -5.057   -4.843    -4.539  
        10 mpg   t_stat   (-8.185) (-10.622) (-7.91) 
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-05-31
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-09-26
          相关资源
          最近更新 更多