我的数据看起来像这样,我现在要做的是创建一个新列“Mean”,我想在“price”列中找到所有相同值的“customer accepted”的平均值。
Product | Price | Customer Accepted
A 17.2 1
A 16.8 0
A 17.2 1
B 21 1
B 16.8 0
A 21 0
C 17.2 0
例如,17.2重复3次,其相应客户接受值的平均值为(1 + 1 + 0/3 = 0.66);类似地,对于16.8,其(0 + 0/2 = 0),对于21,它是(1 + 0/2 = 0.50);新栏目,“平均值”应该在重复相同价格时具有这些值。
我的预期输出
Product | Price | Customer Accepted | Mean
A 17.2 1 0.66
A 16.8 0 0
A 17.2 1 0.66
B 21 1 0.50
B 16.8 0 0
A 21 0 0.50
C 17.2 0 0.66
价格值有大约950个不同的级别,每个值重复的次数不一致。有人可以帮我这个吗?非常感谢
答案 0 :(得分:1)
我们可以使用data.table
library(data.table)
setDT(df)[, Mean := mean(Accpeted), Price]
答案 1 :(得分:0)
在大多数大数据分析包中都有一些称为分组的内容,例如data.table
包。当然,你可以调查一下。但是一些香草R的可能性就是这里的一个:然而,为了便于阅读,这不是最佳的。 (虽然可以缓存值,但会重新计算值。)
a = data.frame(
product = c("A", "A", "A", "B", "B", "A", "C"),
price = c(17.2, 16.8, 17.2, 21, 16.8, 21, 17.2),
accepted = c(1, 0, 1, 1, 0, 0)
)
invisible(
lapply(1:nrow(a), function(i) {
a[i, "mean"] <<- mean(a[a$price == a[i, "price"], "accepted"])
})
)
这确实是你想要做的:迭代每一行,为data.frame分配一个新值,它是所有接受值的平均值,其价格与此行相同。
答案 2 :(得分:0)
我希望我能正确理解你,以下是可以用来做同样的代码。
df <- data.frame(Product = c("A","A","A","B","B","A","C"),Price = c(17.2,16.8,17.2,21,16.8,21,17.2),Accpeted = c(1,0,1,1,0,0,0))
df$mean <- ave(df$Accpeted,df$Price,FUN=mean)
我使用了Base R的ave功能。
输出:
Product Price Accpeted mean
1 A 17.2 1 0.6666667
2 A 16.8 0 0.0000000
3 A 17.2 1 0.6666667
4 B 21.0 1 0.5000000
5 B 16.8 0 0.0000000
6 A 21.0 0 0.5000000
7 C 17.2 0 0.6666667
答案 3 :(得分:0)
dplyr方法看起来像这样。
library(dplyr)
df <- data.frame(Product = c("A","A","A","B","B","A","C"), Price = c(17.2,16.8,17.2,21,16.8,21,17.2), CustomerAccepted=c(1,0,1,1,0,0,0))
df.summ <-
df %>%
group_by(Price) %>%
summarise(Mean = mean(CustomerAccepted))