我有以下data.frame here。在CYC
列中,我有一个属于ID
列的序列。当ID
列中的名称发生变化时,CYC
列中的序列将以1
开头。我的问题是:当序列以2
开头时,如何在NA's
上方插入2
行?如果序列以NA
或3
行开头,如果序列以3 NA
开头,则此解决方案应足够健壮以处理插入两个4
行,依此类推。是否可以将ID
列中的示例名称添加到插入的NA
行,以填充CYC
列中序列的开头?
CYC
列的预期结果示例如下:
CYC
1 NA
2 2
3 3
4 4
5 5
6 6
7 7
8 8
9 9
10 10
11 11
12 12
13 13
14 14
15 15
答案 0 :(得分:1)
为了保持这种自包含,我们在结尾处的注释中使用数据DF
。{/ 1}}。
我们使用THB381
处理每个by
,分别生成ID
和ID
的数据框,从{1}到最后CYC
CYC
1}}。然后ID
这样产生的数据帧。最后,我们将其与原始数据框合并。没有包使用。
rbind
,并提供:
merge(DF,
do.call("rbind", by(DF, DF$ID, with, data.frame(ID = ID[1], CYC = 1:tail(CYC, 1)))),
all = TRUE)
ID CYC POS COUNTS2 CTIME_mins
1 THB381 1 NA NA NA
2 THB381 2 40 206 100.0297
3 THB381 3 40 212 100.0297
4 THB381 4 40 204 100.0296
5 THB381 5 40 186 100.0297
6 THB381 6 40 177 100.0297
7 THB381 7 40 195 100.0297
8 THB381 8 40 189 100.0130
9 THB381 9 40 195 100.0297
10 THB381 10 40 184 100.0297
11 THB381 11 40 209 100.0296
12 THB381 12 40 194 100.0297
13 THB381 13 40 197 100.0297
14 THB381 14 40 194 100.0297
答案 1 :(得分:0)
library('tidyverse')
df <- tribble(
~ID, ~CYC, ~COUNTS,
'WSTD', 1, 1,
'WSTD', 2, 2,
'S1', 2, 3,
'S1', 3, 4,
'S1', 4, 5,
'THB381', 3, 6
)
我们希望获得一个包含ID和CYC所需组合的数据框。我们可以使用列表列和unnest
来完成此操作。
cycs <- df %>%
group_by(ID) %>%
summarise(CYC = list(seq_len(max(CYC)))) %>%
unnest
然后只需right_join
到原始数据框,缺少的行将填充NA
s。
right_join(df, cycs)
#> Joining, by = c("ID", "CYC")
#> # A tibble: 9 x 3
#> ID CYC COUNTS
#> <chr> <dbl> <dbl>
#> 1 S1 1 NA
#> 2 S1 2 3
#> 3 S1 3 4
#> 4 S1 4 5
#> 5 THB381 1 NA
#> 6 THB381 2 NA
#> 7 THB381 3 6
#> 8 WSTD 1 1
#> 9 WSTD 2 2