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

R代码按顺序生成数字并插入行,r,R,我有一个包含两列的数据集。第一列是ID,第二列是季度总数。如果列B(四分之一)的值为8,则应从1到8开始创建8行。列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

我有一个包含两列的数据集。第一列是ID,第二列是季度总数。如果列B(四分之一)的值为8,则应从1到8开始创建8行。列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的基本知识。

我们可以使用
基本R
通过'Quarter'复制'ID',并通过获取该列的
序列创建'Quarter'

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'分组,获取'Quarters'的
序列
,或者只获取
seq(Quarters)

正如@Pierrelaffortune在帖子中评论的那样,如果我们有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的“四分之一”列不是数字,则应在继续之前将其转换为“数字”

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

谢谢Akrun…我试过你建议的基本R代码。我得到这个错误。rep(ID,Quarters)中出错:无效的'times'参数对于第二个选项,我收到此错误。FUN(X[[i]],…)中的错误:参数必须强制为非负整数。您能提供帮助吗?@user2341632请检查
str(yourdata)
,我想您有一个非数字的“TotalQuarters”列。我用数据更新了帖子。这是我的数据结构。类“data.table”和“data.frame”:86 obs。共2个变量:$ID:chr“C.1”“M.1”“R.0”“N.3…”总季度数:19 9 9 10 9 13 1 2…-attr(*,“.internal.selfref”)=阅读了昨天的问题后,他们的问题是NA值。这就是他们的解决方案不起作用的原因。可能添加
df1[,(Quarters=sequence(na.omit(Quarters))),by=ID]
发布的代码为什么又问同样的问题?关于链接副本,您有三个答案。问题在于
NA
值<代码>df1[,(四分之一=序列(na.省略(四分之一)),by=ID]
 df1$Quarters <- as.numeric(as.character(df1$Quarters))
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))