删除和聚合重复项
removing and aggregating duplicates
我已经发布了我正在使用的数据样本 here。
"Parcel.." 是主要的索引变量,有很多重复项。重复项在所有其他列中都不一致。我的目标是聚合数据集,以便每个地块只有一个观察值。
我使用以下代码尝试对数值向量求和:
aggregate(Ap.sample$X.11~Ap.sample$Parcel..,FUN=sum)
问题是它删除了除地块和我引用的其他矢量之外的所有内容。
我的目标是对那个 parcelID 的观察值的某些数值向量(总和)(X.11、X.13、X.15、num_units)使用相同的规则,不同的规则(平均) 对于其他数值向量 (Acres,Ttl_sq_ft,Mtr.Size),对于字符变量仍然有不同的规则(只需选择一个名称)(假设还有另一列 "customer.name" 具有不同的值相同的唯一地块 ID,即 "Steven condominiums" 和 "Stephen apartments"),并删除所有其他变量的额外观察值。
我试过使用 numcolwise
函数,但它也不能满足我的需要。
我的直觉是指定要求和的列以及要取平均值的列,如下所示:
DT<-as.data.table(Ap.sample)
sum_cols<-Ap.05[,c(10,12,14)]
mean_cols<-Ap.05[,c(17:19)]
然后使用 lapply
函数完成每个观察并执行我需要的操作。
df05<-DT[,lapply(.SD,sum), by=DT$Parcel..,.SDcols=sum_cols]
df05<-DT[,lapply(.SD,mean),by=DT$Parcel..,.SDcols=mean_cols]
但是一开始就会出现错误。我知道解决这个问题比强行解决它更简单。
你可以这样做:
library(dplyr)
df %>%
# create an hypothetical "customer.name" column
mutate(customer.name = sample(LETTERS[1:10], size = n(), replace = TRUE)) %>%
# group data by "Parcel.."
group_by(Parcel..) %>%
# apply sum() to the selected columns
mutate_each(funs(sum(.)), one_of("X.11", "X.13", "X.15", "num_units")) %>%
# likewise for mean()
mutate_each(funs(mean(.)), one_of("Acres", "Ttl_sq_ft", "Mtr.Size")) %>%
# select only the desired columns
select(X.11, X.13, X.15, num_units, Acres, Ttl_sq_ft, Mtr.Size, customer.name) %>%
# de-duplicate while keeping an arbitrary value (the first one in row order)
distinct(Parcel..)
我已经发布了我正在使用的数据样本 here。
"Parcel.." 是主要的索引变量,有很多重复项。重复项在所有其他列中都不一致。我的目标是聚合数据集,以便每个地块只有一个观察值。 我使用以下代码尝试对数值向量求和:
aggregate(Ap.sample$X.11~Ap.sample$Parcel..,FUN=sum)
问题是它删除了除地块和我引用的其他矢量之外的所有内容。
我的目标是对那个 parcelID 的观察值的某些数值向量(总和)(X.11、X.13、X.15、num_units)使用相同的规则,不同的规则(平均) 对于其他数值向量 (Acres,Ttl_sq_ft,Mtr.Size),对于字符变量仍然有不同的规则(只需选择一个名称)(假设还有另一列 "customer.name" 具有不同的值相同的唯一地块 ID,即 "Steven condominiums" 和 "Stephen apartments"),并删除所有其他变量的额外观察值。
我试过使用 numcolwise
函数,但它也不能满足我的需要。
我的直觉是指定要求和的列以及要取平均值的列,如下所示:
DT<-as.data.table(Ap.sample)
sum_cols<-Ap.05[,c(10,12,14)]
mean_cols<-Ap.05[,c(17:19)]
然后使用 lapply
函数完成每个观察并执行我需要的操作。
df05<-DT[,lapply(.SD,sum), by=DT$Parcel..,.SDcols=sum_cols]
df05<-DT[,lapply(.SD,mean),by=DT$Parcel..,.SDcols=mean_cols]
但是一开始就会出现错误。我知道解决这个问题比强行解决它更简单。
你可以这样做:
library(dplyr)
df %>%
# create an hypothetical "customer.name" column
mutate(customer.name = sample(LETTERS[1:10], size = n(), replace = TRUE)) %>%
# group data by "Parcel.."
group_by(Parcel..) %>%
# apply sum() to the selected columns
mutate_each(funs(sum(.)), one_of("X.11", "X.13", "X.15", "num_units")) %>%
# likewise for mean()
mutate_each(funs(mean(.)), one_of("Acres", "Ttl_sq_ft", "Mtr.Size")) %>%
# select only the desired columns
select(X.11, X.13, X.15, num_units, Acres, Ttl_sq_ft, Mtr.Size, customer.name) %>%
# de-duplicate while keeping an arbitrary value (the first one in row order)
distinct(Parcel..)