使用group_by合并行并填充空位置?

时间:2017-07-12 14:25:18

标签: r merge

R编码非常新,我一直在尝试使用dplyr中的group_by格式化/合并df中的行。但是,我还没到那儿。

这是我的数据表的简化。前三个条目共享相同的id,最后两个条目共享相同的id。

ID                   Assay1  Assay2  Assay3  Assay4  Assay5
13,12 Months,<=-65C  12      NA      NA      NA      NA
13,12 Months,<=-65C  NA      11      NA      NA      NA
13,12 Months,<=-65C  NA      NA      33      NA      NA
09,06 Months,<=-65C  112     NA      NA      NA      NA
09,06 Months,<=-65C  NA      115     NA      NA      NA

我想实现以下目标:

ID                   Assay1  Assay2  Assay3  Assay4  Assay5
13,12 Months,<=-65C  12      11      33      NA      NA
09,06 Months,<=-65C  112     115     NA      NA      NA

这样,AssayValueX中的值每个唯一ID合并为一行。我已经使用了group_by总结,但我不想要总结......我想要一个新的df与合并的行!如果其他功能更适合实现这一目标,请告诉我。

3 个答案:

答案 0 :(得分:3)

您可以使用dplyrzoo

df %>%
    group_by(ID) %>%
    mutate_each(funs(na.locf(., na.rm = FALSE, fromLast = FALSE)))%>%filter(row_number()==n())


ID                   Assay1  Assay2  Assay3  Assay4  Assay5
13,12 Months,<=-65C  12      11      33      NA      NA
09,06 Months,<=-65C  112     115     NA      NA      NA

修改

为你添加问题

数据:

ID Assay1 Assay2 Assay3 Assay4 Assay5
1 13,12 Months,<=-65C     12     13     NA     NA     NA
2 13,12 Months,<=-65C     11     11    999     NA     NA
3 13,12 Months,<=-65C     NA     NA     33     NA     NA
4 09,06 Months,<=-65C    112     NA     NA     NA     NA
5 09,06 Months,<=-65C     NA    115     NA     NA     NA

<强>解决方案

df=df %>%
    group_by(ID) %>%
    summarise_all(funs(toString(na.omit(.))))
df[df=='']=NA
    > df
                   ID Assay1 Assay2  Assay3 Assay4 Assay5
                <chr>  <chr>  <chr>   <chr>  <chr>  <chr>
1 09,06 Months,<=-65C    112    115    <NA>   <NA>   <NA>
2 13,12 Months,<=-65C 12, 11 13, 11 999, 33   <NA>   <NA>

答案 1 :(得分:2)

这是一个tidyr解决方案。对于您的示例数据,没有Assay4和Assay5数据,因为它们是NA,但它应该与您的实际数据一起使用。基本上,理由是gather数据,删除NA并再次spread

library(tidyr)
df%>%
  gather(Assay, value,-ID)%>% 
  filter(!is.na(value))%>% 
  spread(Assay,value)

                   ID Assay1 Assay2 Assay3
1 09,06 Months,<=-65C    112    115     NA
2 13,12 Months,<=-65C     12     11     33

数据

df <- read.table(text="ID                   Assay1  Assay2  Assay3  Assay4  Assay5
'13,12 Months,<=-65C'  12      NA      NA      NA      NA
'13,12 Months,<=-65C'  NA      11      NA      NA      NA
'13,12 Months,<=-65C'  NA      NA      33      NA      NA
'09,06 Months,<=-65C'  112     NA      NA      NA      NA
'09,06 Months,<=-65C'  NA      115     NA      NA      NA",
 header=TRUE,stringsAsFactors=FALSE)

答案 2 :(得分:1)

通过dplyr

的另一种可能的解决方案
library(dplyr)

df %>% 
  group_by(ID) %>%  
  summarise_all(funs(sum(., na.rm = TRUE))) %>% 
  mutate_all(funs(replace(., . == 0, NA)))

# A tibble: 2 x 6
#                   ID Assay1 Assay2 Assay3 Assay4 Assay5
#               <fctr>  <int>  <int>  <int>  <int>  <int>
#1 09,06_Months,<=-65C    112    115     NA     NA     NA
#2 13,12_Months,<=-65C     12     11     33     NA     NA