[英]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.