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

时间:2019-07-18 16:38:02

标签: r list repeat

我正在尝试将有关每个薪水级别的雇员人数的公司级别数据转换为个人级别数据,以将薪水分配给每个公司薪资范围内的每个雇员数量。 为此,我想按每个薪水级别的员工人数来重复每个薪水级别。

我当前的数据如下:

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 <- 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()命令的错误消息:

  

rep(c(2.97,6.72,8.75,   11.5,15.5,27),times = c(VOI_MQ_2011 $ pay1,:无效的'times'参数

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

  

rep.int(c(2.97,   6.72、8.75、11.5、15.5、27),时间= c(VOI_MQ_2011 $ pay1,:未使用的参数(by = list(VOI_MQ_2011 $ serno))

1 个答案:

答案 0 :(得分:0)

首先创建数据:

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)

现在堆栈()表,然后再通过频率值(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 ...