在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"