R 根据列条目插入行,并根据插入行的位置确定插入行的条目
我有这个数据,我把它命名为:R 根据列条目插入行,并根据插入行的位置确定插入行的条目,r,insert,row,R,Insert,Row,我有这个数据,我把它命名为: A <- read.table(text = "ID TIME EVID AMT DOSE 1 10 1 100 20 1 12 1 100 20 1 14 1 100 20 1 16 1 100 20 1 17 0 100 20 1 18 1 100 20 1 20 1
A <- read.table(text = "ID TIME EVID AMT DOSE
1 10 1 100 20
1 12 1 100 20
1 14 1 100 20
1 16 1 100 20
1 17 0 100 20
1 18 1 100 20
1 20 1 100 20
1 22 1 100 20
2 5 1 100 40
2 10 1 100 40
2 15 1 100 40
2 17 0 100 40
2 20 1 100 40
3 4 1 100 25
3 7 1 100 25
3 10 1 100 25
3 11 0 100 25
3 13 1 100 25
3 16 1 100 25
3 19 1 100 25", header = TRUE)
我尽可能地索引我的EVID
rle(as.character(EVID))$lengths
A$Index<-unlist(sapply(rle(as.character(EVID))$lengths, seq_len), use.names = FALSE)
生成的A有一个新的索引列;我希望新行位于索引1和2之间,即在本例中位于第1、6、13和19行之后
我遇到了这样一种方法,我们可以创建一个列向量,然后按定义的行号将列作为行插入数据中。如何根据列条目添加行并动态确定某些条目
谢谢你的帮助 这是一个包含
数据的解决方案。表
它实际上只是两行代码(带有一些注释)
库(data.table)
ADT不完全清楚如何确定具体在何处插入新行。你能详细说明一下吗please@RicardoSaporta我补充了澄清;谢谢没问题。请看下面
rle(as.character(EVID))$lengths
A$Index<-unlist(sapply(rle(as.character(EVID))$lengths, seq_len), use.names = FALSE)
ID TIME EVID AMT DOSE Index
1 1 10 1 100 20 1
2 1 12 1 100 20 2
3 1 14 1 100 20 3
4 1 16 1 100 20 4
5 1 17 0 100 20 1
6 1 18 1 100 20 1
7 1 20 1 100 20 2
8 1 22 1 100 20 3
9 2 5 1 100 40 4
10 2 10 1 100 40 5
11 2 15 1 100 40 6
12 2 17 0 100 40 1
13 2 20 1 100 40 1
14 3 4 1 100 25 2
15 3 7 1 100 25 3
16 3 10 1 100 25 4
17 3 11 0 100 25 1
18 3 13 1 100 25 1
19 3 16 1 100 25 2
20 3 19 1 100 25 3
library(data.table)
ADT <- data.table(row=1:nrow(A), A, key="ID")
# just to give an idea of how we can Find the first 0 after the first 1, look at the output from this
ADT[, list(row, EVID,c(NA,diff(EVID)), c(NA,diff(EVID))==1)]
# identify afer which row to insert
# the values you want to change, assign using the `=`
# the values to keep, just call the variable name, no `=` sign
newRows <- ADT[c(NA,diff(EVID))==1, list(row=row+1, ID, TIME=TIME+AMT/DOSE, EVID=2, AMT, DOSE)]
# rbind the new rows with the original DT
# then reverse order by EVID, and order by row.
# After ordering, remove the first column (`row`) since it is not needed
newA <- rbind(ADT, newRows)[order(EVID, decreasing=TRUE)][order(row)][, -1, with=FALSE]
### Results:
> newA
ID TIME EVID AMT DOSE
1: 1 10 1 100 20
2: 1 12 1 100 20
3: 1 14 1 100 20
4: 1 16 1 100 20
5: 1 17 0 100 20
6: 1 18 1 100 20
7: 1 23 2 100 20
8: 1 20 1 100 20
9: 1 22 1 100 20
10: 2 5 1 100 40
11: 2 10 1 100 40
12: 2 15 1 100 40
13: 2 17 0 100 40
14: 2 20 1 100 40
15: 2 22 2 100 40
16: 3 4 1 100 25
17: 3 7 1 100 25
18: 3 10 1 100 25
19: 3 11 0 100 25
20: 3 13 1 100 25
21: 3 17 2 100 25
22: 3 16 1 100 25
23: 3 19 1 100 25
ID TIME EVID AMT DOSE