根据分数和几个条件在组中分配变量
Assign variables in groups based on fractions and several conditions
我已经尝试了好几天我认为应该相当简单的东西,但没有成功。希望有人能帮助我!
我有一个名为“test”的数据框,其中包含以下变量:“Firm”、“Year”、“Firm_size”和“Expenditures”。
我想按年份将公司分配到规模组,然后在 table(例如观星者)中显示这些组的平均支出、中位数、std.dev 和 N。因此,第一个规模组(前 10% 最大的公司)应该显示 10% 最大公司每年支出的平均值、中位数 ++。
尺寸组应该是,
- 10% 最大的公司
- 规模在 10-25% 之间的公司
- 规模在 25-50% 之间的公司
- 规模在 50-75% 之间的公司
- 规模在 75-90% 之间的公司
- 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
)。然后按Year
和gs
分组,总结出你想要的指标。
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)
我已经尝试了好几天我认为应该相当简单的东西,但没有成功。希望有人能帮助我!
我有一个名为“test”的数据框,其中包含以下变量:“Firm”、“Year”、“Firm_size”和“Expenditures”。
我想按年份将公司分配到规模组,然后在 table(例如观星者)中显示这些组的平均支出、中位数、std.dev 和 N。因此,第一个规模组(前 10% 最大的公司)应该显示 10% 最大公司每年支出的平均值、中位数 ++。
尺寸组应该是,
- 10% 最大的公司
- 规模在 10-25% 之间的公司
- 规模在 25-50% 之间的公司
- 规模在 50-75% 之间的公司
- 规模在 75-90% 之间的公司
- 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
)。然后按Year
和gs
分组,总结出你想要的指标。
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)