簡體   English   中英

r data.frame pivoting和添加行

[英]r data.frame pivoting and adding rows

我有一個data.frame如下。 它在每列中有許多行和多個值

ID=c(466,469,471,480,509,513,515,517,518,519,520,521,453,455,463,474,477,479,481,482,484,489,496,497,500,503)
name=c(rep("a",12),rep("b",14))
start=c(rep("2/13/2013",12),rep("3/6/2013",14))
end=c(rep("2/20/2013",12),rep("3/13/2013",14))
start=as.Date(start,"%m/%d/%Y")
end=as.Date(end,"%m/%d/%Y")

maint=data.frame(ID,name,start,end)

> (maint[1,])
   ID name      start        end
1 466    a 2013-02-13 2013-02-20

我想獲取數據並將其轉換如下。 我正在為原始數據的第一行提供示例,但我希望對原始數據的所有行執行相同的操作。 請告知如何做到這一點。

我正在開始和結束列,然后查找它們之間的所有有效日期並為每個日期創建一行

ID  name    dates
466 a   2/13/2013
466 a   2/14/2013
466 a   2/15/2013
466 a   2/16/2013
466 a   2/17/2013
466 a   2/18/2013
466 a   2/19/2013
466 a   2/20/2013

我們可以使用data.table 將'data.frame'轉換為'data.table'( setDT(maint) ),按'ID',name'分組(假設每個組合只有一行),我們得到'start'的seq '結束'。

library(data.table)
setDT(maint)[, .(dates = seq(start, end, by = "1 day")) , .(ID, name)]

這是基數R中的一個更長的方法:

# get sequence of dates for each observation
mydates <- Map(function(x, y) seq(x, y, by="days"), as.Date(df$start), as.Date(df$end))
# get number of days for each observation
dates.length <- sapply(mydates, length)

# build a new data.frame
dfNew <- data.frame(ID=rep(df$ID, dates.length), 
                    name=rep(df$name, dates.length),
                    dates=as.Date(unlist(mydates), origin=as.Date("1970-01-01"))

正如@ user2100721在注釋中指出的那樣,可以使用seq.Date直接簡化Map函數:

mydates <- Map(seq.Date, as.Date(df$start), as.Date(df$end), by="days")

數據

df <- read.table(header=T, text="ID name      start        end
1 466    a 2013-02-13 2013-02-20
2 467    b 2011-02-13 2011-02-22", as.is=T)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM