簡體   English   中英

根據 R 中數據框中的列擴展數據框

[英]Expand a dataframe based on columns in the dataframe in R

我在 R 中有以下數據框

 df<-data.frame( 
       "Val1"=seq(from=1, to=40, by=5), 'Val2'=c(2,4,2,5,11,3,5,3), 
       "Val3"=seq(from=5, to=40, by=5), "Val4"=c(3,5,7,3,7,5,7,8))

結果數據框如下所示。 Val 1、Val3 是因果變量,Val2、Val4 是因變量

       Val1 Val2 Val3 Val4      
 1        1    2    5     3  
 2        6    4   10     5  
 3        11    2   15    7  
 4        16    5   20    3  
 5        21   11   25    7  
 6        26    3   30    5  
 7        31    5   35    7  
 8        36    3   40    8  

我希望獲得以下數據幀作為輸出

      Val1   Val2  Val3  Val4
  1     1      2     1    NA
  2     2      NA    2    NA
  3     3      NA    3    3
  4     4      NA    4   NA
  5     5      NA    5   NA
  6     6      4     6   NA
  7     7      NA    7   NA
  8     8      NA    8   NA
  9     9      NA    9   NA
  10   10      NA   10   5
  11   11      2    11   NA
  12   12      NA   12   NA
  13   13      NA   13   NA
  14   14      NA   14   NA
  15   15      NA   15   7
  16   16      5    16   NA
  17   17      NA   17   NA
  18   18      NA   18   NA
  19   19      NA   19   NA
  20   20       NA   20   3
  21   21       11   21   NA
 22   22       NA   22   NA
 23   23       NA   23   NA
 24   24       NA   24   NA
 25   25       NA   25   7
 26   26        3    26   NA
 27   27       NA   27   NA
 28   28       NA   28   NA
 29   29       NA   29   NA
 30   30       NA   30   5
 31   31       5    31   NA
 32   32       NA   32   NA
 33   33       NA   33   NA
 34   34       NA   34   NA
 35   35        NA   35   7
 36   36        3    36   NA
 37   37        NA   37   NA
 38   38        NA   38   NA
 39   39        NA   39   NA
 40   40        NA   40   8

我如何實現這一點。 我創建了以下代碼,但它涉及創建第二個數據幀,然后將數據從第一個復制到第二個。 有沒有辦法覆蓋現有的數據框。 我想避免循環

   df2<-data.frame('Val1'=

   seq(from=min(na.omit(c(df$Val1, df$Val3))), to= max(na.omit(c(df$Val1, 
   df$Val3))), by=1), "Val3"=seq(from=min(na.omit(c(df$Val1, df$Val3))), to= 
   max(na.omit(c(df$Val1, df$Val3))), by=1))
     ###### Create two loops 
     for(i in df$Val1){
    for(j in df2$Val1){
    if(i==j){
    df2$Val2[df2$Val1==j]=df$Val2[df$Val1==i]
    } else{df2$Val2[df2$Val1==j]=NA}}}


   for(i in df$Val3){  for(j in df2$Val3){
   if(i==j){df2$Val4[df2$Val3==j]=df$Val4[df$Val3==i]
  } else{df2$Val4[df2$Val3==j]=NA}}}

是否有更快的矢量化方法來完成相同的任務。 請求某人幫助

假設您的輸出示例中存在輕微錯誤(第 3 行應為Val4顯示NA ,第3行中的 3 應在第 5 行中),這有效:

library(tidyverse)

df_new <- bind_cols(
  df %>%
    select(Val1, Val2) %>%
    complete(., expand(., Val1 = 1:40)),
  df %>%
    select(Val3, Val4) %>%
    complete(., expand(., Val3 = 1:40))
)

> df_new
# A tibble: 40 x 4
    Val1  Val2  Val3  Val4
   <dbl> <dbl> <dbl> <dbl>
 1     1     2     1    NA
 2     2    NA     2    NA
 3     3    NA     3    NA
 4     4    NA     4    NA
 5     5    NA     5     3
 6     6     4     6    NA
 7     7    NA     7    NA
 8     8    NA     8    NA
 9     9    NA     9    NA
10    10    NA    10     5
# ... with 30 more rows

我們使用bind_cols()將數據bind_cols()兩部分放在一起:首先我們選擇前兩列, expand()因果變量和complete()數據,然后我們對第三和第四列再次執行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM