将数据帧IN R扩展为更大的数据帧

时间:2019-02-21 04:28:02

标签: r dataframe dplyr tidyr

我已经使用下面的代码生成了数据帧df1

 df1<-data.frame("ID"=c("A", "A", "A", "A", "A", "B", "B", "B", 'B', "B"), 
     "X_Fr"=c(NA, NA, NA, NA,NA,1,2,3,4,5), "X_Ax"=c(NA, NA, NA, NA, NA, 
      .2,.3,.4,.2, .3),
       "Y_Fr"=c(1,2,3,4,5,1,2,3,4,5), 
      "Y_Ax"=c(.1,.2,.3,.4,.1,.3,.4,.5,.2,.3),"Z_Fr"=c(1,2,NA, NA, 3, 
       1,3,4,5,10), 
       "Z_Ax"=c(.1,.2,NA,NA,.5, .1,.2,.4,.3,.5) )



    ID X_Fr X_Ax Y_Fr Y_Ax Z_Fr Z_Ax
 1   A   NA   NA    1  0.1    1  0.1
 2   A   NA   NA    2  0.2    2  0.2
 3   A   NA   NA    3  0.3   NA   NA
 4   A   NA   NA    4  0.4   NA   NA
 5   A   NA   NA    5  0.1    3  0.5
 6   B    1  0.2    1  0.3    1  0.1
 7   B    2  0.3    2  0.4    3  0.2
 8   B    3  0.4    3  0.5    4  0.4
 9   B    4  0.2    4  0.2    5  0.3
 10  B    5  0.3    5  0.3   10  0.5

我想扩展数据框以提供以下数据框作为输出

     ID X_Fr Y_Fr Z_Fr X_Ax Y_Ax Z_Ax
  1   A    1    1    1   NA  0.1  0.1
  2   A    2    2    2   NA  0.2  0.2
  3   A    3    3    3   NA  0.3  0.5
  4   A    4    4    4   NA  0.4   NA
  5   A    5    5    5   NA  0.1   NA
  6   B    1    1    1  0.2  0.3  0.1
  7   B    2    2    2  0.3  0.4   NA
  8   B    3    3    3  0.4  0.5  0.2
  9   B    4    4    4  0.2  0.2  0.4
  10  B    5    5    5  0.3  0.3  0.3
  11  B    6    6    6   NA   NA   NA
  12  B    7    7    7   NA   NA   NA
  13  B    8    8    8   NA   NA   NA
  14  B    9    9    9   NA   NA   NA
  15  B   10   10   10   NA   NA  0.5

我尝试了以下代码来获取上述数据框

 library(tidyr)
 library(dplyr)

 df2<-df1 %>% complete(ID, nesting(X_Fr=full_seq(na.omit(c(X_Fr, Y_Fr, 
 Z_Fr)),1), Y_Fr=full_seq(na.omit(c(X_Fr, Y_Fr, Z_Fr)),1), 
 Z_Fr=full_seq(na.omit(c(X_Fr, Y_Fr, Z_Fr)),1)))

我无法获得此结果。我要求某人看看。

1 个答案:

答案 0 :(得分:1)

我认为这是两个步骤,因此我创建了两个新的数据框,对其进行处理,并在以后加入它们

library(dplyr)
library(tidyr)
df1x<-df1 %>% select(ID,matches('^X|^Y')) #select ID and any cloumn start with X or Y
df1y<-df1 %>% select(ID,matches('^Z'))

df1y %>% group_by(ID) %>% #group by ID column
         arrange(Z_Fr, .by_group=TRUE) %>% #arrange Z_Fr column in ascending order so we can use row_number later
         mutate(Z_Fr=coalesce(Z_Fr,as.numeric(row_number()))) %>% #Use row_number to fill NA's in Z_Fr. 
         #See ?dplyr::row_number() for more details
         ungroup() %>% #Before using complete we need to ungroup
         complete(ID, nesting(Z_Fr=full_seq(Z_Fr,1))) %>% 
         left_join(df1x, by=c('ID','Z_Fr'='Y_Fr')) #left join using "on" ID and Z_Fr from df1y and Y_Fr from df1x