【问题标题】:Keeping character/factor variables when taking the mean of a dataset在取数据集的平均值时保留字符/因子变量
【发布时间】:2019-02-20 12:03:48
【问题描述】:

我有一个大型数据集,以下是其中的示例:

# 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  

我通过使用以下数据表解决方案进行了总结:

dfclevel= df[, lapply(.SD, weighted.mean, wt, na.rm = TRUE), .SDcols = cols, by=matchcode]

在此操作中,代表字符串的 7 个因子变量被删除,因为显然没有国家名称的加权平均值。但是,由于我采用matchcode 的平均值,这是年份和国家/地区的组合,因此来自那些已删除的变量的信息仍然有意义(对于每个匹配代码它们应该相同)并且出于这个和其他原因,我想保留这些列。

所以最大的问题是,我该怎么做?我可以暂时将这些因子转换为数值,然后在跨列应用加权平均值后将它们转换回来吗?

【问题讨论】:

    标签: r string type-conversion mean factors


    【解决方案1】:

    我通过子设置因子并通过matchcode 对这些因子进行抽样来解决了我的问题。这会导致所需的结果,因为正如原始帖子中所解释的,每个 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)
    

    【讨论】:

      猜你喜欢
      • 2020-04-15
      • 2018-07-15
      • 1970-01-01
      • 2019-04-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-20
      • 1970-01-01
      相关资源
      最近更新 更多