是否有一种可重复的方法可以从现有的 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"]
编辑:添加标准偏差
我是 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"]
编辑:添加标准偏差