[英]Event data from rows to columns by ID in R, Reshape?
我有數千行這種形式的數據:
a= c("id", "start", "mid1", "mid2", "finish")
b= c("id1", "date1", "date2", "date3", "date4")
c= c("id2", "date5", "date6", NA, "date7")
d= c("id3", "date8", "date9", "date10", "date11")
df=as.data.frame(rbind(b,c,d))
colnames(df)=a
rownames(df)=c(1:nrow(df))
df
# id start mid1 mid2 finish
# 1 id1 date1 date2 date3 date4
# 2 id2 date5 date6 <NA> date7
# 3 id3 date8 date9 date10 date11
# ...
我需要以這種形式使用它:
id; event ;date
id1; start ;date1
id1; mid1 ;date2
id1; mid2 ;date3
id1; finish ;date4
id2; start ;date5
id2; mid1 ;date6
id2; finish ;date7
id3; start ;date8
id3; mid1 ;date9
id3; mid2 ;date10
id3; finish ;date11
...
我發現這個問題幾乎是相同的,但反過來又一樣: 如何將列轉換為R中的行?
我怎樣才能完成轉型?
如評論中所述,您可以使用tidyr::gather
。 在這里,我將其與dplyr
結合使用,並將它們與%>%
鏈接在一起。
library(tidyr); library(dplyr)
df %>%
gather(event, date, -id) %>%
arrange(id) %>%
filter(!is.na(date))
導致
id event date
1 id1 start date1
2 id1 mid1 date2
3 id1 mid2 date3
4 id1 finish date4
5 id2 start date5
6 id2 mid1 date6
7 id2 finish date7
8 id3 start date8
9 id3 mid1 date9
10 id3 mid2 date10
11 id3 finish date11
您需要在原始數據中放入NA
而不是空白,並且正如Davide所說,使用melt
忽略NA
以獲得所需的結果:
> df
id start mid1 mid2 finish
1 id1 date1 date2 date3 date4
2 id2 date5 date6 <NA> date7
3 id3 date8 date9 date10 date11
library(reshape2)
melt(df, id.vars="id", variable.name="event",value.name="date",na.rm=TRUE)
出於多樣性的考慮,您可以在base R中執行以下操作:
cbind(df[1], stack(lapply(df[-1], as.character)), row.names = NULL)
# id values ind
# 1 id1 date1 start
# 2 id2 date5 start
# 3 id3 date8 start
# 4 id1 date2 mid1
# 5 id2 date6 mid1
# 6 id3 date9 mid1
# 7 id1 date3 mid2
# 8 id2 <NA> mid2
# 9 id3 date10 mid2
# 10 id1 date4 finish
# 11 id2 date7 finish
# 12 id3 date11 finish
如果要擺脫該NA
並使用order
以所需的行順序獲取數據,可以將其包裝在na.omit
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.