是否有一种可重复的方法可以从现有的 table 中获得 table 的方法

Is there a reproducible way of making a table of means from an existing table

我是 R 的初学者,请多多包涵。

我的问题的玩具示例有点像这样 -

Fruits Number
1_Fruit_A 18
2_Fruit_A 20
3_Fruit_A 24
1_Fruit_B 50
2_Fruit_B 63
3_Fruit_B 45
1_Fruit_C 71
2_Fruit_C 75
3_Fruit_C 72

然后从这个 table,我希望创建另一个 table,我在其中存储数据有点像这样 -

Fruits Means Standard Deviation
Fruit A - Average 20.67 3
Fruit B - Average 52.67 2
Fruit C - Average 72.67 4

我需要编写一个可重现的代码,我什至可以用它来表示彩色球或鲜花而不是水果,但总是一式三份的平均值,需要存储在另一个 table 上,其中一列重命名并且一列方法,然后我将使用 ggplot 绘制结果 table。任何帮助将不胜感激。

您可以从Fruits列中提取公共值并将其用作组,然后在每个组中取平均值。

对于您的示例,您可以在 -.

之后删除所有内容

使用dplyr

library(dplyr)

df %>%
  group_by(Fruits = sub('\s-.*', '', Fruits)) %>%
  summarise(Number = mean(Number), .groups = 'drop')

#   Fruits   Number
#1 Fruit A 20.66667
#2 Fruit B 52.66667
#3 Fruit C 72.66667

在基础 R 中,

aggregate(Number~Fruits, transform(df, Fruits = sub('\s-.*', '', Fruits)), mean)

与@Ronak Shah 的解决方案非常相似,但这里我根据您更新的数据在 Fruits 列上包含了可重现的数据和自定义的文本操作:

mydf <- data.frame(Fruits = 
                   c("1_Fruit_A",   
                     "2_Fruit_A",   
                     "3_Fruit_A",   
                     "1_Fruit_B",   
                     "2_Fruit_B",   
                     "3_Fruit_B",   
                     "1_Fruit_C",   
                     "2_Fruit_C", 
                     "3_Fruit_C"), 
                  Number = c(18, 20, 24, 50, 63, 45, 71, 75, 72))


mydf$Fruits <- mydf %>% 
  pull(Fruits) %>% 
  gsub("^[[:digit:]]+[_]", "", .) %>% 
  gsub("[_]", " ", .) %>% paste0(" - Average")

# Intermediate result
mydf
#              Fruits Number
# 1 Fruit A - Average     18
# 2 Fruit A - Average     20
# 3 Fruit A - Average     24
# 4 Fruit B - Average     50
# 5 Fruit B - Average     63
# 6 Fruit B - Average     45
# 7 Fruit C - Average     71
# 8 Fruit C - Average     75
# 9 Fruit C - Average     72


newdf <- mydf %>% group_by(Fruits) %>% summarise(Means = mean(Number), 
                                        `Standard Deviation` =  sd(Number))

# Final result

newdf
# # A tibble: 3 x 3
#    Fruits            Means  `Standard Deviation`
#     <chr>             <dbl>                <dbl>
# 1 Fruit A - Average  20.7                 3.06
# 2 Fruit B - Average  52.7                 9.29
# 3 Fruit C - Average  72.7                 2.08

我认为此代码符合您的目的,但我强烈建议删除 Fruits 列中的词 Average,因为它具有误导性。这意味着 Mean 列中的值不是每组值的平均值,而是每组值的平均值的平均值。

使用data.table

library(data.table)

# create a new column which includes common string to aggregate upon

setDT(dfs)[,':='(
  aggstr = substr(Fruits, 0, nchar(Fruits)-1)
  # OR using regex 
  # aggstr = sub('\s-.*', '', Fruits)
)]
result.dt <- dfs[,.(Avg = mean(Number) , Sd= sd(Number)), by="aggstr"]

编辑:添加标准偏差