R代码按顺序生成数字并插入行

时间:2016-08-12 13:08:02

标签: r

我有一个包含2列的数据集。第一列是ID,第二列是总季度。如果Col B(四分之一)的值为8,那么应该从1到8创建8行.col A中的ID对于所有行应该是相同的。下面显示的数据集就是一个例子。

ID        Quarters
A         5
B         2
C         1

预期输出

ID       Quarters
A         1
A         2
A         3
A         4
A         5
B         1
B         2
C         1

这是我尝试过的。

library(data.table)
setDT(df.WQuarter)[, (Quarters=1:Quarters), ID]

我收到此错误。你能帮忙吗?我整天都被困在这里。我只是在学习R的基础知识。

1 个答案:

答案 0 :(得分:3)

我们可以使用base R复制“ID' by' Quarters'并创建'宿舍'通过获取该列的sequence

with(df1, data.frame(ID= rep(ID, Quarters), Quarters = sequence(Quarters)))
#   ID Quarters
#1  A        1
#2  A        2
#3  A        3
#4  A        4
#5  A        5
#6  B        1
#7  B        2
#8  C        1

如果我们使用data.table,请转换' data.frame'到' data.table' (setDT(df1)),按“ID'”分组,获取'季度'的sequence或只是seq(Quarters)

library(data.table)
setDT(df1)[, .(Quarters=sequence(Quarters)) , by = ID]

正如@PierreLaFortune对帖子发表了评论,如果我们有NA值,那么我们需要删除它

setDT(df1)[, .(Quarters = seq_len(Quarters[!is.na(Quarters)])), by = ID]

或使用dplyr/tidyr

library(dplyr)
library(tidyr)
df1 %>%
     group_by(ID) %>% 
     mutate(Quarters = list(seq(Quarters))) %>% 
     ungroup() %>% 
     unnest(Quarters)

如果OP" Quarters"列是非数字的,应该转换为'数字'在继续之前

 df1$Quarters <- as.numeric(as.character(df1$Quarters))

如果列为as.character,则factor会有效,但如果characteras.numeric类,df1 <- structure(list(ID = c("A", "B", "C"), Quarters = c(5L, 2L, 1L )), .Names = c("ID", "Quarters"), class = "data.frame", row.names = c(NA, -3L)) 就足够了。

数据

where