我有一个包含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的基础知识。
答案 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
会有效,但如果character
为as.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