Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
基于R中数据帧中的列展开数据帧_R_Performance_Dataframe_For Loop_If Statement - Fatal编程技术网

基于R中数据帧中的列展开数据帧

基于R中数据帧中的列展开数据帧,r,performance,dataframe,for-loop,if-statement,R,Performance,Dataframe,For Loop,If Statement,我在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)) 我希望获得以下数据帧作为输出 Val1 Val2 Val3 Val4 1 1 2 1 NA 2

我在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))
我希望获得以下数据帧作为输出

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

df2假设输出示例中有轻微错误(第3行应显示
NA
for
Val4
,第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
库(tidyverse)
df_新%
选择(Val1,Val2)%>%
完成(,展开(,Val1=1:40)),
df%>%
选择(Val3,Val4)%>%
完成(,展开(,Val3=1:40))
)
>德福乌新酒店
#一个tibble:40x4
Val1 Val2 Val3 Val4
1 1 2 1 NA
2钠2钠
3NA 3NA
4NA 4NA
5 NA 5 3
6 4 6 NA
7 NA 7 NA
8NA 8NA
9NA 9NA
10 NA 10 5
# ... 还有30行
我们使用
bind\u cols()
将数据帧的两部分放在一起:
首先,我们选择前两列,
expand()
因果变量和
complete()
数据,然后再次选择第三列和第四列。

谢谢。这正是我需要的。循环减慢了代码的速度。如何知道我们使用的是tidytext还是plyr软件包?我可以将代码扩展到更多列吗相关的包是
dplyr
。你是指一个因果变量和一个因变量的多个组合,还是每个因果变量有多个因变量?一个因果变量和一个因变量的多个组合
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