折叠具有相同日期的行并保留值
Colapse rows wit same date and keep value
我有一个具有以下结构的数据集:
Date
AA
BB
CC
DD
EE
1/03/2014
0.2
NA
NA
NA
NA
1/03/2014
NA
0.3
NA
NA
NA
1/03/2014
NA
NA
1.2
NA
NA
2/03/2014
NA
NA
NA
3.4
NA
2/03/2014
NA
NA
NA
NA
5.6
3/03/2014
NA
0.5
NA
NA
NA
3/03/2014
NA
NA
1.6
NA
NA
我想创建这样的东西:
Date
AA
BB
CC
DD
EE
1/03/2014
0.2
0.3
1.2
NA
NA
2/03/2014
NA
NA
NA
3.4
5.6
3/03/2014
NA
0.5
1.6
NA
NA
我该怎么做?
有了 tidyverse
你可以试试这个:
数据
df <- read.table( text= "Date AA BB CC DD EE
1/03/2014 0.2 NA NA NA NA
1/03/2014 NA 0.3 NA NA NA
1/03/2014 NA NA 1.2 NA NA
2/03/2014 NA NA NA 3.4 NA
2/03/2014 NA NA NA NA 5.6
3/03/2014 NA 0.5 NA NA NA
3/03/2014 NA NA 1.6 NA NA", header = T)
代码
df %>%
group_by(Date) %>%
fill(AA:EE) %>%
slice_tail()
输出
# A tibble: 3 x 6
# Groups: Date [3]
Date AA BB CC DD EE
<fct> <dbl> <dbl> <dbl> <dbl> <dbl>
1 1/03/2014 0.2 0.3 1.2 NA NA
2 2/03/2014 NA NA NA 3.4 5.6
3 3/03/2014 NA 0.5 1.6 NA NA
df %>%
pivot_longer(-Date)%>%
na.omit()%>%
pivot_wider(Date)
# A tibble: 3 x 6
Date AA BB CC DD EE
<chr> <dbl> <dbl> <dbl> <dbl> <dbl>
1 1/03/2014 0.2 0.3 1.2 NA NA
2 2/03/2014 NA NA NA 3.4 5.6
3 3/03/2014 NA 0.5 1.6 NA NA
第三个选项将保留每个 Date
的多行(如果可能存在的话)(尽管使用 sort
可以重新排列它们...):
library(dplyr)
dat %>%
group_by(Date) %>%
mutate(across(everything(), ~ sort(., na.last = TRUE))) %>%
filter(if_any(everything(), ~ !is.na(.))) %>%
ungroup()
# # A tibble: 3 x 6
# Date AA BB CC DD EE
# <chr> <dbl> <dbl> <dbl> <dbl> <dbl>
# 1 1/03/2014 0.2 0.3 1.2 NA NA
# 2 2/03/2014 NA NA NA 3.4 5.6
# 3 3/03/2014 NA 0.5 1.6 NA NA
我有一个具有以下结构的数据集:
Date | AA | BB | CC | DD | EE |
---|---|---|---|---|---|
1/03/2014 | 0.2 | NA | NA | NA | NA |
1/03/2014 | NA | 0.3 | NA | NA | NA |
1/03/2014 | NA | NA | 1.2 | NA | NA |
2/03/2014 | NA | NA | NA | 3.4 | NA |
2/03/2014 | NA | NA | NA | NA | 5.6 |
3/03/2014 | NA | 0.5 | NA | NA | NA |
3/03/2014 | NA | NA | 1.6 | NA | NA |
我想创建这样的东西:
Date | AA | BB | CC | DD | EE |
---|---|---|---|---|---|
1/03/2014 | 0.2 | 0.3 | 1.2 | NA | NA |
2/03/2014 | NA | NA | NA | 3.4 | 5.6 |
3/03/2014 | NA | 0.5 | 1.6 | NA | NA |
我该怎么做?
有了 tidyverse
你可以试试这个:
数据
df <- read.table( text= "Date AA BB CC DD EE
1/03/2014 0.2 NA NA NA NA
1/03/2014 NA 0.3 NA NA NA
1/03/2014 NA NA 1.2 NA NA
2/03/2014 NA NA NA 3.4 NA
2/03/2014 NA NA NA NA 5.6
3/03/2014 NA 0.5 NA NA NA
3/03/2014 NA NA 1.6 NA NA", header = T)
代码
df %>%
group_by(Date) %>%
fill(AA:EE) %>%
slice_tail()
输出
# A tibble: 3 x 6
# Groups: Date [3]
Date AA BB CC DD EE
<fct> <dbl> <dbl> <dbl> <dbl> <dbl>
1 1/03/2014 0.2 0.3 1.2 NA NA
2 2/03/2014 NA NA NA 3.4 5.6
3 3/03/2014 NA 0.5 1.6 NA NA
df %>%
pivot_longer(-Date)%>%
na.omit()%>%
pivot_wider(Date)
# A tibble: 3 x 6
Date AA BB CC DD EE
<chr> <dbl> <dbl> <dbl> <dbl> <dbl>
1 1/03/2014 0.2 0.3 1.2 NA NA
2 2/03/2014 NA NA NA 3.4 5.6
3 3/03/2014 NA 0.5 1.6 NA NA
第三个选项将保留每个 Date
的多行(如果可能存在的话)(尽管使用 sort
可以重新排列它们...):
library(dplyr)
dat %>%
group_by(Date) %>%
mutate(across(everything(), ~ sort(., na.last = TRUE))) %>%
filter(if_any(everything(), ~ !is.na(.))) %>%
ungroup()
# # A tibble: 3 x 6
# Date AA BB CC DD EE
# <chr> <dbl> <dbl> <dbl> <dbl> <dbl>
# 1 1/03/2014 0.2 0.3 1.2 NA NA
# 2 2/03/2014 NA NA NA 3.4 5.6
# 3 3/03/2014 NA 0.5 1.6 NA NA