gpt4 book ai didi

r - 将数据表中的行熔化或复制一定次数并在 R 中包含计数器

转载 作者:行者123 更新时间:2023-12-04 01:34:04 44 4
gpt4 key购买 nike

我想“扩展”一个数据框,将某些列上的信息复制到第五列指示的次数。

用 R 完成这项任务的效率最高的是什么? (打开数据表或 Dplyer, reshape 解决方案)。

原始数据框/数据表:

   f_1 f_2        d_1        d_2 i_1
1: 1 A 2016-01-01 <NA> NA
2: 2 A 2016-01-02 <NA> NA
3: 2 B 2016-01-03 2016-01-01 2
4: 3 C 2016-01-04 <NA> NA
5: 4 D 2016-01-05 2016-01-02 5

所需的数据框/数据表

    f_1 f_2        d_1        d_2 i_1
1: 1 A 2016-01-01 <NA> NA
2: 2 A 2016-01-02 <NA> NA
3: 2 B 2016-01-03 2016-01-01 1
4: 2 B 2016-01-03 2016-01-01 2
5: 3 C 2016-01-04 <NA> NA
6: 4 D 2016-01-05 2016-01-02 1
7: 4 D 2016-01-05 2016-01-02 2
8: 4 D 2016-01-05 2016-01-02 3
9: 4 D 2016-01-05 2016-01-02 4
10: 4 D 2016-01-05 2016-01-02 5

可重现的数据:

DT <- data.table(
f_1 = factor(c(1,2,2,3,4)),
f_2 = factor(c("A", "A", "B", "C", "D")),
d_1 = as.Date(c("2016-01-01","2016-01-02","2016-01-03","2016-01-04","2016-01-05")),
d_2 = as.Date(c(NA,NA,"2016-01-01",NA,"2016-01-02")),
i_1 = as.integer(c(NA,NA,2,NA,5)))

谢谢,如有重复请见谅。我正在为这种 reshape 练习而苦苦挣扎。

最佳答案

这是一个data.table 解决方案。基本上,按要复制的那些列分组,并使用 i_1

中的数字生成整数序列
DT[, .(i_1=if(!is.na(i_1)) seq_len(i_1) else i_1), 
by=c(names(DT)[-ncol(DT)])]

输出:

    f_1 f_2        d_1        d_2 i_1
1: 1 A 2016-01-01 <NA> NA
2: 2 A 2016-01-02 <NA> NA
3: 2 B 2016-01-03 2016-01-01 1
4: 2 B 2016-01-03 2016-01-01 2
5: 3 C 2016-01-04 <NA> NA
6: 4 D 2016-01-05 2016-01-02 1
7: 4 D 2016-01-05 2016-01-02 2
8: 4 D 2016-01-05 2016-01-02 3
9: 4 D 2016-01-05 2016-01-02 4
10: 4 D 2016-01-05 2016-01-02 5

或者使用 data.table 的另一种方式。对于每一行,使用 i_1 创建一个数字序列,并使用 c(.SD[, -"i_1], ..... 将原始数据添加到该序列最后删除 by

DT[, c(.SD[, -"i_1"], .(i_1=if (!is.na(i_1)) seq_len(i_1) else i_1)), 
by=seq_len(DT[,.N])][,-1L]

关于r - 将数据表中的行熔化或复制一定次数并在 R 中包含计数器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50697690/

44 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com