根据分数和几个条件在组中分配变量

Assign variables in groups based on fractions and several conditions

我已经尝试了好几天我认为应该相当简单的东西,但没有成功。希望有人能帮助我!

我有一个名为“test”的数据框,其中包含以下变量:“Firm”、“Year”、“Firm_size”和“Expenditures”。

我想按年份将公司分配到规模组,然后在 table(例如观星者)中显示这些组的平均支出、中位数、std.dev 和 N。因此,第一个规模组(前 10% 最大的公司)应该显示 10% 最大公司每年支出的平均值、中位数 ++。

尺寸组应该是,

这是我试过的:

test<-arrange(test, -Firm_size)
test$Variable = 0
test[1:min(5715, nrow(test)),]$Variable <- "Expenditures, 0% size <10%"
test[5715:min(14288, nrow(test)),]$Variable <- "Expenditures, 10% size <25%"
test[14288:min(28577, nrow(test)),]$Variable <- "Expenditures, 25% size <50%"
--> And so on


library(dplyr)
testtest = test%>%
 group_by(Variable)%>%
  dplyr::summarise(
    Mean=mean(Expenditures),
    Median=median(Expenditures),
    Std.dev=sd(Expenditures),
    N=n()
  )

stargazer(testtest, type = "text", title = "Expenditures firms", digits = 1, summary = FALSE)

如上所示,我不知道如何按百分比使用 fractions/group。因此,在将 Firm_size 排列为降序后,我尝试根据行对公司进行分组。这样做的问题是我没有考虑我需要考虑的年份,而且每年(总共 20 个)要做很多工作。
我的意图是创建一个新变量,为每个大小组命名。例如。每年前 10% 最大的公司应该得到一个名为“支出,0% 规模 <10%”的变量

此外,我制作了一个新的数据框“testtest”,在使用 stargazer 呈现它之前,我在其中计算了不同的度量。这行得通。

!!编辑!! 再次嗨,

现在,当 运行 新数据集上的代码(但它是与以前相同的变量)时,我收到错误“List object cannot be coerced to type double”。

我指的 mutate-step 是您提供的解决方案中“rowwise()”之后的“mutate(gs = cut ++”。

enter image description here

The_code

The_error

您可以将分位数创建为嵌套变量 (size_groups),然后使用 cut() 创建组大小 (gs)。然后按Yeargs分组,总结出你想要的指标。

test %>% 
  group_by(Year) %>% 
  mutate(size_groups = list(quantile(Firm_size, probs=c(.1,.25,.5,.75,.9)))) %>% 
  rowwise() %>% 
  mutate(gs = cut(
    Firm_size,c(-Inf, size_groups, Inf),
    labels = c("Lowest 10%","10%-25%","25%-50%","50%-75%","75%-90%","Highest 10%"))) %>% 
  group_by(Year, gs) %>% 
  summarize(across(Expenditures,.fns = list(mean,median,sd,length)), .groups="drop") %>% 
  rename_all(~c("Year", "Group_Size", "Mean_Exp", "Med_Exp", "SD_Exp","N_Firms"))

输出:

# A tibble: 126 x 6
    Year Group_Size  Mean_Exp Med_Exp SD_Exp N_Firms
   <int> <fct>          <dbl>   <dbl>  <dbl>   <int>
 1  2000 Lowest 10%    20885.  21363.  3710.       3
 2  2000 10%-25%       68127.  69497. 19045.       4
 3  2000 25%-50%       42035.  35371. 30335.       6
 4  2000 50%-75%       36089.  29802. 17724.       6
 5  2000 75%-90%       53319.  54914. 19865.       4
 6  2000 Highest 10%   57756.  49941. 34162.       3
 7  2001 Lowest 10%    55945.  47359. 28283.       3
 8  2001 10%-25%       61825.  70067. 21777.       4
 9  2001 25%-50%       65088.  76340. 29960.       6
10  2001 50%-75%       57444.  53495. 32458.       6
# ... with 116 more rows

如果您想要一个包含年均值的附加列,您可以从 summarize(across()) 行中删除 .groups="drop",然后将最后一行添加到管道中:

mutate(YrMean = sum(Mean_Exp*N_Firms/sum(N_Firms)))

请注意,这是由每个 Group_size 中的公司数量正确加权的,因此 returns 等同于使用原始数据

test %>% group_by(Year) %>% summarize(mean(Expenditures))

输入数据:

set.seed(123)
test = data.frame(
  Firm = replicate(2000, sample(letters,1)),
  Year = sample(2000:2020, 2000, replace=T),
  Firm_size= ceiling(runif(2000,2000,5000)),
  Expenditures = runif(2000, 10000,100000)
) %>% group_by(Firm,Year) %>% slice_head(n=1)