操纵数据框,以便每个人在一行中具有所有相关值

时间:2017-03-18 15:17:10

标签: r postgresql dataframe dplyr melt

我正在试图找出巩固数据框架的最佳方法,而我似乎遇到了障碍。如何将这两行合并,以便迈克尔的试用和购买日期位于同一行?

         **user**    | **trial_date**  | **purchase_date**
         Michael     |   01-02-2016    |      NA 
         Michael     |      NA         |   02-15-2016

2 个答案:

答案 0 :(得分:2)

您可以使用spread中的gathertidyr函数来删除NAs,首先将两列收集到一列中,然后在组合数据中过滤NA列,然后将它们传播回去。

df %>%
  group_by(user) %>% 
  gather("type", "date", trial_date, purchase_date) %>% 
  filter(!is.na(date)) %>%
  spread(type, date)


#      user purchase_date trial_date
# *  <fctr>         <chr>      <chr>
# 1 Michael    02-15-2016 02-15-2016

答案 1 :(得分:0)

user对数据框进行分组后,您可以从每列中获取第一个非NA值,如果所有元素都是NA,.[!is.na(.)]将返回NULL,并使用[1]强制转换为NA索引:

df %>% group_by(user) %>% summarise_all(funs(.[!is.na(.)][1]))

# A tibble: 1 × 3
#     user trial_date purchase_date
#   <fctr>     <fctr>        <fctr>
#1 Michael 01-02-2016    02-15-2016