【问题标题】:Event data from rows to columns by ID in R, Reshape?R中按ID从行到列的事件数据,重塑?
【发布时间】:2014-12-20 21:15:01
【问题描述】:

我有几千行这种形式的数据:

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
...

我发现这个问题几乎相同,但反过来:How to transform Columns to rows in R?

我怎样才能完成转换?

【问题讨论】:

  • 看看reshape2::melt
  • 看看tidyr::gather

标签: r reshape


【解决方案1】:

如 cmets 中所述,您可以使用 tidyr::gather。这里我将它与dplyr结合使用,并与%&gt;%链接在一起。

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

【讨论】:

  • 做到了!非常感谢!
【解决方案2】:

您需要在原始数据中输入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)

【讨论】:

  • 我添加了 df=df[with(df, order(df$id)),] 现在这也可以了!非常感谢!我怎么能把绿色支票也给你?
  • 由您来判断谁对您的问题帮助最大!
【解决方案3】:

为了多样化,您可以在基础 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 中。

【讨论】:

  • 谢谢!我想知道是否有一种申请方式……很高兴看到有!
  • @ElinaJ,这并不是真正的应用方式。 lapply 是必需的,因为您是如何创建数据框的。 stack 不适用于因子。
猜你喜欢
  • 1970-01-01
  • 2020-10-16
  • 2022-01-16
  • 2016-12-11
  • 2015-09-30
  • 2017-07-16
  • 1970-01-01
  • 2017-11-26
  • 1970-01-01
相关资源
最近更新 更多