创建变量并将函数附加到另一个函数

问题描述 投票:0回答:1

我有一个数据框,其中包含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

我能够复制行,但是我不知道如何用所需的值同时创建新列。

请不要介意列中的日期值,我将在最后修复它们。

提前感谢

r
1个回答
0
投票

由于我是data.table软件包的粉丝,所以我将使用data.table提出解决方案。您可以通过在控制台上键入以下内容来安装它:install.packages("data.table")

我的方法是创建一个单独的data.frame,其索引从0Giorni中的任何数字按行从原始data.frame开始,然后将此新data.frame与您拥有的原始数据,并通过与指定键的多对一匹配,结果data.frame将“扩展”到所需大小,因此在必要时“复制”行。

为此,我使用了seq_len()。如果执行seq_len(3L),则会得到:[1] 1 2 3,即从1Llength.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
© www.soinside.com 2019 - 2024. All rights reserved.