我有一个数据框,其中包含Arrivo列(格式为日期)和Giorni列(格式为整数),其天数(例如:2、3、6等)。我想对这些列应用两个函数,确切地说,我想为Giorni列中的数字复制一行,并且在复制这些行时,我想创建一个名为data.osservazione的新列,该列等于Arrivo并反复增加一天的时间。
来自此:
No. Casa Anno Data Categoria Camera Arrivo Stornata.il Giorni
1 2.867 SEELE 2019 03/09/2019 CDV 316 28/03/2020 NA 3
2 148.000 SEELE 2020 20/01/2020 CDS 105 29/03/2020 NA 3
3 3.684 SEELE 2019 16/11/2019 CD 102 02/04/2020 NA 5
对此:
No. data.osservazione Casa Anno Data Categoria Camera Arrivo
1 2867 3/28/2020 SEELE 2019 03/09/2019 CDV 316 3/28/2020 0:00:00
2 2867 3/29/2020 SEELE 2019 03/09/2019 CDV 316 3/28/2020 0:00:00
3 2867 3/30/2020 SEELE 2019 03/09/2019 CDV 316 3/28/2020 0:00:00
4 148 3/29/2020 SEELE 2020 20/01/2020 CDS 105 3/29/2020 0:00:00
5 148 3/30/2020 SEELE 2020 20/01/2020 CDS 105 3/29/2020 0:00:00
6 148 3/31/2020 SEELE 2020 20/01/2020 CDS 105 3/29/2020 0:00:00
Stornata.il Giorni
1 #N/D 3
2 #N/D 3
3 #N/D 3
4 #N/D 3
我能够复制行,但是我不知道如何用所需的值同时创建新列。
请不要介意列中的日期值,我将在最后修复它们。
提前感谢
由于我是data.table
软件包的粉丝,所以我将使用data.table
提出解决方案。您可以通过在控制台上键入以下内容来安装它:install.packages("data.table")
。
我的方法是创建一个单独的data.frame
,其索引从0
到Giorni
中的任何数字按行从原始data.frame
开始,然后将此新data.frame
与您拥有的原始数据,并通过与指定键的多对一匹配,结果data.frame
将“扩展”到所需大小,因此在必要时“复制”行。
为此,我使用了seq_len()
。如果执行seq_len(3L)
,则会得到:[1] 1 2 3
,即从1L
到length.out
时在length.out >= 1L
中给出的任何整数的序列。因此,seq_len()
将产生一个以Giorni
中的任何内容结尾的序列,因为length.out
中的seq_len()
必须是大小为1的向量,所以挑战是逐行进行。 ]语法来完成此任务。
因此,我们开始吧,首先加载by
:
data.table
在您的示例中,尚不清楚data.table
是否为library(data.table) # load data.table
setDT(data) # data.frame into data.table
格式,我认为不是,因此我转换为Arrivo
–您需要在以后添加它。
Date
[下一位是关键,使用Date
语法中的# is `Arrivo`` date? If no, into date fmt
data[["Arrivo"]] <- as.Date(data[["Arrivo"]], format = "%d/%m/%y")
和seq_len()
,我用序列创建了一个单独的by
-始终是data.table
,反之则不是-通过data.table
的每个元素,可以将数据扩展到所需的大小。我使用data.frame
是因为我想将Giorni
应用于与by = "No."
关联的seq_len()
的每个值。Giorni
中的值。
No.
检查结果,您可以看到我现在要去的地方:
No.
最后,您将# create an index with the count from `Giorni`, subtract by 1 so the first day is 0.
d1 <- data[, seq_len(Giorni) - 1, by = "No."]
与原始数据进行内部联接,我在这里使用> d1
No. V1
1: 2867 0
2: 2867 1
3: 2867 2
4: 148 0
5: 148 1
连接语法。然后将索引d1
添加到data.table
:
V1
结果:
Arrivo
接下来的命令只是修饰,格式化日期并删除列:
# merge with previous data
res <- d1[data, on = "No."]
# add days to `Arrivo``, create column data.osservazione
res[ , data.osservazione := V1 + Arrivo]
控制台:
> res
No. V1 Casa Anno Data Categoria Camera Arrivo
1: 2867 0 SEELE 2019 03/09/2019 CDV 316 2020-03-28
2: 2867 1 SEELE 2019 03/09/2019 CDV 316 2020-03-28
3: 2867 2 SEELE 2019 03/09/2019 CDV 316 2020-03-28
4: 148 0 SEELE 2019 20/01/2020 CDS 105 2020-03-29
5: 148 1 SEELE 2019 20/01/2020 CDS 105 2020-03-29
Stornata.il Giorni data.osservazione
1: NA 3 2020-03-28
2: NA 3 2020-03-29
3: NA 3 2020-03-30
4: NA 2 2020-03-29
5: NA 2 2020-03-30