【问题标题】:Expand a dataframe IN R into a larger dataframe将数据框 IN R 扩展为更大的数据框
【发布时间】:2019-02-21 04:28:01
【问题描述】:

我已经使用下面的代码生成了一个数据框 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

我尝试了下面的代码来获取上面的dataframe

 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)))

我无法获得此结果。我请人看看。

【问题讨论】:

  • 你能描述一下从输入到输出的逻辑吗?例如,为什么 Z_Ax 在第 3 行变为 0.5?
  • X_Fr、Y_Fr、Z_Fr 在基于 ID 的新数据帧中具有相同的值范围。 X_Ax、Y_Ax、Z_Ax 将根据它们在原始数据框中的值进行填充。如果 X_Fr 中没有值 ex,则 ID -A 中没有值,对于 X_Fr 的值在 1-5 之间,NA 将被填充。

标签: r dataframe dplyr tidyr


【解决方案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

【讨论】:

    猜你喜欢
    • 2021-12-08
    • 1970-01-01
    • 1970-01-01
    • 2014-03-30
    • 2014-12-13
    • 2017-11-15
    • 1970-01-01
    • 2019-06-18
    • 2018-11-09
    相关资源
    最近更新 更多