创建一个新变量,该变量采用R

时间:2017-05-10 08:11:00

标签: r

我的数据看起来像这样,我现在要做的是创建一个新列“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个不同的级别,每个值重复的次数不一致。有人可以帮我这个吗?非常感谢

4 个答案:

答案 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))