R中的数据表-数据分组(条件)
假设我有下面的数据框。 如何创建包含整个id的平均价格的新列,并将每个id的范围=2作为平均价格的计算R中的数据表-数据分组(条件),r,dataframe,R,Dataframe,假设我有下面的数据框。 如何创建包含整个id的平均价格的新列,并将每个id的范围=2作为平均价格的计算 dt<-data.frame(id=c(11,11,11,11,12,12,12),range=c(1,1,2,2,1,2,2),price=c(10,20,30,40,10,20,30)) id range price 1 11 1 10 2 11 1 20 3 11 2 30 4 11 2 40 5 12 1
dt<-data.frame(id=c(11,11,11,11,12,12,12),range=c(1,1,2,2,1,2,2),price=c(10,20,30,40,10,20,30))
id range price
1 11 1 10
2 11 1 20
3 11 2 30
4 11 2 40
5 12 1 10
6 12 2 20
7 12 2 30
id range price price2
1 11 1 10 35
2 11 1 20 35
3 11 2 30 35
4 11 2 40 35
5 12 1 10 25
6 12 2 20 25
7 12 2 30 25
dt一种方法是使用aggregate
函数。下面是一个例子
dt<-data.frame(id=c(11,11,11,11,12,12,12),range=c(1,1,2,2,1,2,2),price=c(10,20,30,40,10,20,30))
# calculate the menas by id and range
mean_by_group <- aggregate(dt$price, list(id = dt$id, range = dt$range), mean)
# remove other results
mean_by_group <- mean_by_group[mean_by_group$range == 2, ]
# merge back to the original dataframe
dt <- merge(dt, mean_by_group[, c(1, 3)], by = c('id'))
或者,您可以使用dplyr
和magrittr
包装:
dt %<>%
group_by(id, range) %>%
summarise(price2 = mean(price)) %>%
filter(range == 2) %>%
{merge(dt, .[, c(1, 3)], by = 'id')}
一种方法是使用aggregate
函数。下面是一个例子
dt<-data.frame(id=c(11,11,11,11,12,12,12),range=c(1,1,2,2,1,2,2),price=c(10,20,30,40,10,20,30))
# calculate the menas by id and range
mean_by_group <- aggregate(dt$price, list(id = dt$id, range = dt$range), mean)
# remove other results
mean_by_group <- mean_by_group[mean_by_group$range == 2, ]
# merge back to the original dataframe
dt <- merge(dt, mean_by_group[, c(1, 3)], by = c('id'))
或者,您可以使用dplyr
和magrittr
包装:
dt %<>%
group_by(id, range) %>%
summarise(price2 = mean(price)) %>%
filter(range == 2) %>%
{merge(dt, .[, c(1, 3)], by = 'id')}
data.table解决方案如下所示:
library(data.table)
dt=as.data.table(dt)[,price2:=mean(price[range==2]),by=id]
data.table解决方案如下所示:
library(data.table)
dt=as.data.table(dt)[,price2:=mean(price[range==2]),by=id]
对data.table使用连接
setDT(dt)
x <- dt[range == 2,list(price2 = mean(price)), by = id]
dt <- dt[x, on = .(id)]
setDT(dt)
x对data.table使用联接
setDT(dt)
x <- dt[range == 2,list(price2 = mean(price)), by = id]
dt <- dt[x, on = .(id)]
setDT(dt)
x