簡體   English   中英

R mutate_at 在行子集上

[英]R mutate_at on a subset of rows

我的問題與這篇文章類似( 將 mutate_at 有條件地應用於 R 中的 dataframe 中的特定行),我可以重現結果。 但是,當我嘗試將其應用於我的問題時,即在選定行和列的單元格值上加上括號時,我遇到了錯誤消息。 這是一個可重現的示例。

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似乎不接受 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)

基本上,您需要先將dbl轉換為char ,這就是錯誤消息中所說的Error: must be a character vector, not a double vector

正如@Rohan 所說, case_when 是類型嚴格的,這意味着它期望 output 與 class 相同。

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

output 為

# 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) 

錯誤消息是......沒有幫助。

您的問題是您在列中混合了數字和字符數據。 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) 

case_when是類型嚴格的,這意味着它期望 output 與 class 相同。 您的原始列是數字類型,而在您的數據周圍添加"("時,您正在使其成為 class 字符。

funs也早已被棄用, mutate_at很快就會被 cross 取代across

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM