在summary()中使用特定于参数的信息

在summary()中使用特定于参数的信息,r,dplyr,tidyr,R,Dplyr,Tidyr,给定以下数据帧: mydf <- data.frame( Treatment = c('T1', 'T1', 'T1', 'T1', 'T1', 'T1', 'T2', 'T2', 'T2', 'T2', 'T2', 'T2'), Observation = c('pH', 'pH', 'pH', 'RS', 'RS', 'RS', 'pH', 'pH', 'pH', 'RS', 'RS', 'RS'), Value = c(3.13, 3.21, 3.26, 19

给定以下数据帧:

mydf <- data.frame(
    Treatment = c('T1', 'T1', 'T1', 'T1', 'T1', 'T1', 'T2', 'T2', 'T2', 'T2', 'T2', 'T2'),
    Observation = c('pH', 'pH', 'pH', 'RS', 'RS', 'RS', 'pH', 'pH', 'pH', 'RS', 'RS', 'RS'),
    Value = c(3.13, 3.21, 3.26, 19.20, 19.50, 9.70, 3.13, 3.40, 3.31, 11.00, 18.10, 7.50)
)
mydf %>% group_by(Treatment, Observation) %>% 
  summarise(MeanSD = sprintf("%0.2f $\\pm$ %0.2f", mean(Value), sd(Value))) %>% 
  spread(Observation, MeanSD) %>% 
ungroup()
下面是该代码的输出:

# A tibble: 2 x 3
  Treatment                 pH                  RS
*    <fctr>              <chr>               <chr>
1        T1 "3.20 $\\pm$ 0.07" "16.13 $\\pm$ 5.57"
2        T2 "3.28 $\\pm$ 0.14" "12.20 $\\pm$ 5.40"
这就产生了这个错误:

Error in summarise_impl(.data, dots) : 
  Evaluation error: recursive indexing failed at level 2
.

什么是实现我目标的正确咒语?

你会犯这个错误,因为你无法从这样的列表中提取

fmtStr[[mydf$Observation]]
# Error in fmtStr[[mydf$Observation]] : 
#   recursive indexing failed at level 2
您可以使用fmtStr[mydf$Observation]将列表子集,并将其转换为具有unlist的字符向量,但这在summary命令中仍然不起作用,因为您将为组中的每个观察设置一个字符串,而不是仅为摘要值设置一个字符串

mydf %>% 
  group_by(Treatment, Observation) %>% 
  summarise(MeanSD = sprintf(unlist(fmtStr[Observation]), mean(Value), sd(Value)))
# Error in summarise_impl(.data, dots) : 
#   Column `MeanSD` must be length 1 (a summary value), not 3
因为您的数据是按观察值分组的,所以您可以假设在一个组中每个观察值都是相同的,因此只需使用第一个值

mydf %>% 
  group_by(Treatment, Observation) %>% 
  summarise(MeanSD = sprintf(fmtStr[Observation][[1]], mean(Value), sd(Value)))
# # A tibble: 4 x 3
# # Groups:   Treatment [?]
#   Treatment Observation MeanSD            
#   <fct>     <fct>       <chr>             
# 1 T1        pH          "3.20 $\\pm$ 0.07"
# 2 T1        RS          "16 $\\pm$ 5.6"   
# 3 T2        pH          "3.28 $\\pm$ 0.14"
# 4 T2        RS          "12 $\\pm$ 5.4"  
所以你的完整代码看起来像

mydf %>% 
  group_by(Treatment, Observation) %>% 
  summarise(MeanSD = sprintf(fmtStr[Observation][[1]], mean(Value), sd(Value))) %>% 
  spread(Observation, MeanSD) %>% 
  ungroup()
# # A tibble: 2 x 3
#   Treatment pH                 RS             
#   <fct>     <chr>              <chr>          
# 1 T1        "3.20 $\\pm$ 0.07" "16 $\\pm$ 5.6"
# 2 T2        "3.28 $\\pm$ 0.14" "12 $\\pm$ 5.4"
mydf %>% 
  group_by(Treatment, Observation) %>% 
  summarise(MeanSD = sprintf(fmtStr[Observation][[1]], mean(Value), sd(Value)))
# # A tibble: 4 x 3
# # Groups:   Treatment [?]
#   Treatment Observation MeanSD            
#   <fct>     <fct>       <chr>             
# 1 T1        pH          "3.20 $\\pm$ 0.07"
# 2 T1        RS          "16 $\\pm$ 5.6"   
# 3 T2        pH          "3.28 $\\pm$ 0.14"
# 4 T2        RS          "12 $\\pm$ 5.4"  
mydf %>% 
  group_by(Treatment, Observation) %>% 
  summarise(MeanSD = sprintf(fmtStr[Observation][[1]], mean(Value), sd(Value))) %>% 
  spread(Observation, MeanSD) %>% 
  ungroup()
# # A tibble: 2 x 3
#   Treatment pH                 RS             
#   <fct>     <chr>              <chr>          
# 1 T1        "3.20 $\\pm$ 0.07" "16 $\\pm$ 5.6"
# 2 T2        "3.28 $\\pm$ 0.14" "12 $\\pm$ 5.4"