取数据集的平均值时保留 character/factor 个变量
Keeping character/factor variables when taking the mean of a dataset
我有一个大型数据集,以下是其中的示例:
# A tibble: 450 x 546
matchcode idstd year country wt region income industry sector ownership exporter c201 c202 c203a c203b c203c c203d c2041 c2042 c205a c205b1 c205b2 c205b3 c205b4 c205b5 c205b6 c205b7 c205b8 c205b9 c205b10 c205c c205d c206a c206b c2071
<int+lbl> <dbl> <dbl> <int+l> <dbl> <dbl+> <dbl+> <dbl+lb> <dbl+> <dbl+lbl> <dbl+lb> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl+> <dbl+> <dbl+> <dbl+> <dbl+> <dbl+> <dbl+> <dbl+> <dbl+> <dbl+l> <dbl> <dbl> <dbl> <dbl> <dbl>
1 "BGD 200~ 2474 2002 Bangla~ 0.9 6 1 3 1 2 1 1994 2 100 0 0 NA 2 NA NA NA NA NA NA NA NA NA NA NA NA 1 2 NA NA 1
2 "BGD 200~ 2717 2002 Bangla~ 1.2 6 1 2 1 2 2 1986 4 100 0 0 NA 2 NA NA NA NA NA NA NA NA NA NA NA NA 1 1 2 2 2
3 "BGD 200~ 2410 2002 Bangla~ 0.8 6 1 3 1 2 1 1999 4 100 0 0 NA 2 NA NA NA NA NA NA NA NA NA NA NA NA 2 NA NA NA 1
4 "BRA 200~ 14917 2003 Brazil~ NA 4 2 8 1 2 2 1984 2 100 0 0 0 2 NA 50 1 NA NA NA NA NA NA NA NA 1 1 1 1 2 3
5 "BRA 200~ 14546 2003 Brazil~ NA 4 2 2 1 2 2 1976 2 100 0 0 0 2 NA 50 1 NA NA NA NA NA NA NA NA 1 1 1 1 2 4
6 "BRA 200~ 14709 2003 Brazil~ NA 4 2 3 1 2 2 1990 2 100 0 0 0 2 NA 100 NA 1 NA NA NA NA NA NA NA NA 1 1 1 2 4
7 "KHM 200~ 16475 2003 Cambod~ NA 2 1 20 2 2 2 1999 2 100 0 0 0 2 NA 100 NA NA NA 1 NA NA NA NA NA NA NA NA 1 2 1
8 "KHM 200~ 16298 2003 Cambod~ NA 2 1 4 3 2 2 1993 4 100 0 0 0 2 NA 100 1 NA NA NA NA NA NA NA NA NA 1 2 1 2 4
9 "KHM 200~ 16036 2003 Cambod~ 1.2 2 1 21 2 2 2 1997 2 100 0 0 0 2 NA 100 NA 1 NA NA NA NA NA NA NA NA 1 1 1 2 1
10 "CHN 200~ 17862 2002 China2~ 1.1 2 2 18 2 2 2 1993 3 49 0 51 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA 2
我用下面的数据总结出来的table解决方案:
dfclevel= df[, lapply(.SD, weighted.mean, wt, na.rm = TRUE), .SDcols = cols, by=matchcode]
在此操作中,删除了代表字符串的 7 个因子变量,因为显然没有国家名称的加权平均值。但是,由于我采用 matchcode
的平均值,它是年份和国家/地区的组合,因此来自那些已删除的变量的信息仍然有意义(它们对于每个匹配代码都应该相同)并且出于这个和其他原因, 我想保留这些专栏。
所以最大的问题是,我该怎么做?我可以暂时将这些因素转换为数值,然后在对列应用加权平均值后将它们转换回来吗?
我通过 matchcode
子设置因素并从这些因素中抽样解决了我的问题。这导致了预期的结果,因为如原始 post 中所述,每个 matchcode
的因子列没有变化
df <- as.data.frame(df)
is.fact <- sapply(df, is.factor)
dffactors <- df[, is.fact]
dffactors <- data.table(dffactors)
df <- data.table(df)
dffactors <- dffactors[,.SD[sample(.N, min(1,.N))],by = matchcode]
然后我取原始df的平均值:
dfclevel= df[, lapply(.SD, weighted.mean, wt, na.rm = TRUE), .SDcols = cols, by=matchcode]
并将样本与 dfclevel
合并
dfclevel <- merge(dfclevel , dffactors, by= "matchcode", all.x = TRUE, allow.cartesian=FALSE)
我有一个大型数据集,以下是其中的示例:
# A tibble: 450 x 546
matchcode idstd year country wt region income industry sector ownership exporter c201 c202 c203a c203b c203c c203d c2041 c2042 c205a c205b1 c205b2 c205b3 c205b4 c205b5 c205b6 c205b7 c205b8 c205b9 c205b10 c205c c205d c206a c206b c2071
<int+lbl> <dbl> <dbl> <int+l> <dbl> <dbl+> <dbl+> <dbl+lb> <dbl+> <dbl+lbl> <dbl+lb> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl+> <dbl+> <dbl+> <dbl+> <dbl+> <dbl+> <dbl+> <dbl+> <dbl+> <dbl+l> <dbl> <dbl> <dbl> <dbl> <dbl>
1 "BGD 200~ 2474 2002 Bangla~ 0.9 6 1 3 1 2 1 1994 2 100 0 0 NA 2 NA NA NA NA NA NA NA NA NA NA NA NA 1 2 NA NA 1
2 "BGD 200~ 2717 2002 Bangla~ 1.2 6 1 2 1 2 2 1986 4 100 0 0 NA 2 NA NA NA NA NA NA NA NA NA NA NA NA 1 1 2 2 2
3 "BGD 200~ 2410 2002 Bangla~ 0.8 6 1 3 1 2 1 1999 4 100 0 0 NA 2 NA NA NA NA NA NA NA NA NA NA NA NA 2 NA NA NA 1
4 "BRA 200~ 14917 2003 Brazil~ NA 4 2 8 1 2 2 1984 2 100 0 0 0 2 NA 50 1 NA NA NA NA NA NA NA NA 1 1 1 1 2 3
5 "BRA 200~ 14546 2003 Brazil~ NA 4 2 2 1 2 2 1976 2 100 0 0 0 2 NA 50 1 NA NA NA NA NA NA NA NA 1 1 1 1 2 4
6 "BRA 200~ 14709 2003 Brazil~ NA 4 2 3 1 2 2 1990 2 100 0 0 0 2 NA 100 NA 1 NA NA NA NA NA NA NA NA 1 1 1 2 4
7 "KHM 200~ 16475 2003 Cambod~ NA 2 1 20 2 2 2 1999 2 100 0 0 0 2 NA 100 NA NA NA 1 NA NA NA NA NA NA NA NA 1 2 1
8 "KHM 200~ 16298 2003 Cambod~ NA 2 1 4 3 2 2 1993 4 100 0 0 0 2 NA 100 1 NA NA NA NA NA NA NA NA NA 1 2 1 2 4
9 "KHM 200~ 16036 2003 Cambod~ 1.2 2 1 21 2 2 2 1997 2 100 0 0 0 2 NA 100 NA 1 NA NA NA NA NA NA NA NA 1 1 1 2 1
10 "CHN 200~ 17862 2002 China2~ 1.1 2 2 18 2 2 2 1993 3 49 0 51 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA 2
我用下面的数据总结出来的table解决方案:
dfclevel= df[, lapply(.SD, weighted.mean, wt, na.rm = TRUE), .SDcols = cols, by=matchcode]
在此操作中,删除了代表字符串的 7 个因子变量,因为显然没有国家名称的加权平均值。但是,由于我采用 matchcode
的平均值,它是年份和国家/地区的组合,因此来自那些已删除的变量的信息仍然有意义(它们对于每个匹配代码都应该相同)并且出于这个和其他原因, 我想保留这些专栏。
所以最大的问题是,我该怎么做?我可以暂时将这些因素转换为数值,然后在对列应用加权平均值后将它们转换回来吗?
我通过 matchcode
子设置因素并从这些因素中抽样解决了我的问题。这导致了预期的结果,因为如原始 post 中所述,每个 matchcode
df <- as.data.frame(df)
is.fact <- sapply(df, is.factor)
dffactors <- df[, is.fact]
dffactors <- data.table(dffactors)
df <- data.table(df)
dffactors <- dffactors[,.SD[sample(.N, min(1,.N))],by = matchcode]
然后我取原始df的平均值:
dfclevel= df[, lapply(.SD, weighted.mean, wt, na.rm = TRUE), .SDcols = cols, by=matchcode]
并将样本与 dfclevel
dfclevel <- merge(dfclevel , dffactors, by= "matchcode", all.x = TRUE, allow.cartesian=FALSE)