我在R中有以下数据框
DF2<-data.frame("A"= c(1,2,3,4,5), "A_1"= c(1,2,3,4,5), "B"= c(1,2,10,NA,NA), "B_1"=c(2,3,10,NA, NA), "ID"=c("A", "A", "A","A","A"))
我尝试使用代码扩展数据框
library(dplyr)
library(tidyr)
df2= DF2 %>%
mutate(E=pmax(A,B,na.rm = TRUE))%>%
complete(E = seq(max(E)))
E列应由A和B中的值范围组成。A_1,B_1值应与E列中的相应值对齐
我得到以下输出
ID E A A_1 B B_1
1 A 1 1 1 1 2
2 A 2 2 2 2 3
3 A 3 NA NA NA NA
4 A 4 4 4 NA NA
5 A 5 5 5 NA NA
6 A 6 NA NA NA NA
7 A 7 NA NA NA NA
8 A 8 NA NA NA NA
9 A 9 NA NA NA NA
10 A 10 3 3 10 10
但是,我希望得到以下输出
E ID A A_1 B B_1
1 1 A 1 1 1 2
2 2 A 2 2 2 3
3 3 A 3 3 NA NA
4 4 A 4 4 NA NA
5 5 A 5 5 NA NA
6 6 A NA NA NA NA
7 7 A NA NA NA NA
8 8 A NA NA NA NA
9 9 A NA NA NA NA
10 10 A NA NA 10 10
我要求有人在这里提供帮助。最终输出应将A_1值与E列值匹配,以使E值等于A值,否则应返回零。 ID是分组变量
答案 0 :(得分:1)
使用group_by
中的ID
和complete
中的max
使用E
replace
和NA
,{ t匹配列E
library(dplyr)
library(tidyr)
DF2 %>%
mutate(E=pmax(A,B,na.rm = TRUE)) %>%
group_by(ID) %>%
complete(E = seq(max(E))) %>%
mutate_at(vars(matches("^A|^B")), ~replace(., . != E, NA))
# ID E A A_1 B B_1
# <fct> <dbl> <dbl> <dbl> <dbl> <dbl>
# 1 A 1 1 1 1 2
# 2 A 2 2 2 2 3
# 3 A 3 NA NA NA NA
# 4 A 4 4 4 NA NA
# 5 A 5 5 5 NA NA
# 6 A 6 NA NA NA NA
# 7 A 7 NA NA NA NA
# 8 A 8 NA NA NA NA
# 9 A 9 NA NA NA NA
#10 A 10 NA NA 10 10