R:按组按不同变量集的值重复向量值

R: Repeat values of vector by values of different set of variables by group

我正在尝试将有关每个薪酬级别的员工人数的公司级别数据转换为个人级别数据,这些数据将薪酬分配给每个公司薪酬范围内的每个员工人数。 这样做时,我想按每个薪酬级别的员工人数重复每个薪酬级别。

我目前的数据是这样的:

serno pay1 pay2 pay3 pay4 pay5 pay6
10001  0    1    0    1    1    8
10002  0    0    14  317  644  1610
10003  5    19  103  204  93    27
10004  0    5    49  124  403  927

现在我要:

serno Pay 
10001 pay2
10001 pay4
10001 pay6
.
.
10001 pay8
10002 pay3
10002 pay3
.
.
10002 pay6
.
.

我使用了重复和次数代码。虽然这适用于将整体公司级别数据转换为个人级别数据,因为我创建了一个等于 firm_name 乘以 total_employees 的列表,但它不适用于重复薪酬水平乘以每个薪酬水平的员工对于每个工作场所。

我创建了一个包含每个工作场所所有员工的列表:

serno <- rep(VOI_MQ_2011$serno, times = VOI_MQ_2011$employees_total, by=list(VOI_MQ_2011$serno))

当尝试用 pay variales 对向量做同样的事情时,它不起作用:

pay <- rep(c(2.97, 6.72, 8.75, 11.50, 15.50, 27), times = c(VOI_MQ_2011$pay1, VOI_MQ_2011$pay2, VOI_MQ_2011$pay3, VOI_MQ_2011$pay4, VOI_MQ_2011$pay5, VOI_MQ_2011$pay6), by=list(VOI_MQ_2011$serno))

我也试过 rep.int 命令:

pay <- rep.int(c(2.97, 6.72, 8.75, 11.50, 15.50, 27), times = c(VOI_MQ_2011$pay1, VOI_MQ_2011$pay2, VOI_MQ_2011$pay3, VOI_MQ_2011$pay4, VOI_MQ_2011$pay5, VOI_MQ_2011$pay6), by=list(VOI_MQ_2011$serno))

rep() 命令的错误消息:

Error in rep(c(2.97, 6.72, 8.75, 11.5, 15.5, 27), times = c(VOI_MQ_2011$pay1, : invalid 'times' argument

rep.int() 命令的错误消息:

Error in rep.int(c(2.97, 6.72, 8.75, 11.5, 15.5, 27), times = c(VOI_MQ_2011$pay1, : unused argument (by = list(VOI_MQ_2011$serno))

首先创建数据:

dta <- read.table(text="serno pay1 pay2 pay3 pay4 pay5 pay6
10001  0    1    0    1    1    8
10002  0    0    14  317  644  1610
10003  5    19  103  204  93    27
10004  0    5    49  124  403  927", header=TRUE)

现在 stack() table,然后按 Freq 值 rep() 数据帧的行。

dta.st <- stack(dta[-1])
dta.df <- data.frame(serno=dta$serno, dta.st[, 2:1])
colnames(dta.df) <- c("serno", "pay", "Freq")
dta.df2 <- dta.df[rep(rownames(dta.df), dta.df$Freq), 1:2]
dta.df2 <- dta.df2[order(dta.df2$serno, dta.df2$pay), ]
rownames(dta.df2) <- NULL
head(dta.df2)
#   serno  pay
# 1 10001 pay2
# 2 10001 pay4
# 3 10001 pay5
# 4 10001 pay6
# 5 10001 pay6
# 6 10001 pay6
str(dta.df3)
# 'data.frame': 4555 obs. of  2 variables:
#  $ serno: int  10001 10001 10001 10001 10001 10001 10001 10001 ...
#  $ pay  : Factor w/ 6 levels "pay1","pay2",..: 2 4 5 6 6 6 6 6 ...