如何在循环R中创建独立的不同data.frame

时间:2019-12-10 16:09:26

标签: r dataframe

大家晚上好

我对for循环的构造感到困惑,我没有任何问题,但是我想了解如何创建数据帧“独立”(具有某些区别的重复)。

我一步一步地编写了代码(它可以工作),但是我认为也许可以用for压缩代码。

x是我的原始数据。

str(x)
Classes ‘data.table’ and 'data.frame':  13500 obs. of  6 variables:
 $ a: int  1 56 1058 567 987 574 1001...
 $ b: int  10 5 10 5 5 10 10 5 10 10 ...
 $ c: int  NA NA NA NA NA NA NA NA NA NA ...
 $ d: int  0 0 0 0 0 0 0 0 0 0 ...
 $ e: int  0 0 0 0 0 0 0 0 0 0 ...
 $ f: int  22 22 22 22 22 22 22 22 22 22 ...

我的首要目标是删除每一列最终的NA和“”元素。我通过这些行代码来做到这一点。

x_b<- x[!(!is.na(x$b) & x$b==""), ]
x_c<- x[!(!is.na(x$c) & x$c==""), ]
x_d<- x[!(!is.na(x$d) & x$d==""), ]
x_e<- x[!(!is.na(x$e) & x$e==""), ]
x_f<- x[!(!is.na(x$f) & x$f==""), ]

此后的第二个目标是为每个新数据创建一个我使用功能paste0(x_b$a, x_b$f)创建的ID代码。

x_b$ID_1<-paste0(x_b$a, x_b$b)
x_c$ID_2<-paste0(x_c$a, x_c$c)
x_d$ID_3<-paste0(x_c$a, x_c$d)
x_e$ID_4<-paste0(x_c$a, x_c$e)
x_f$ID_5<-paste0(x_c$a, x_c$f)

我创建了这个for循环,以尝试最小化我使用的行,并创建良好的代码可视化。

z<-data.frame("a", "b","c","d","e","f")
zy<-data.frame("x_b", "x_c", "x_d", "x_e", "x_f")


for(i in z) {
  for (j in zy ) {
    target <- paste("_",i)
    x[[i]]<-(!is.na(x[[i]]) & x[[i]]=="") #with this I able to create a column on the x data.frame, 
                                          #but if I put a new dataframe the for doesn't work
                                          #the name, but I don't want this. I'd like to create a 
                                          #data.base per each transformation.

                                          #at this point of the script, I should have a new 
                                          #different dataframe, as x_b, x_c, x_d, x_e, x_f but I 
                                          #don't know

                                          #How to create them?

                                          #If I have these data frame I will do this anther function 
                                          #in the for loop:
    zy[[ID]]<-paste0(x_b$a, "_23X")
   }
}

我希望将其输出为:

str(x_b)
    Classes ‘data.table’ and 'data.frame':  13500 obs. of  6 variables:
     $ a: int  1 56 1058 567 987 574 1001...
     $ b: int  10 5 10 5 5 10 10 5 10 10 ...
     $ c: int  NA NA NA NA NA NA NA NA NA NA ...
     $ d: int  0 0 0 0 0 0 0 0 0 0 ...
     $ e: int  0 0 0 0 0 0 0 0 0 0 ...
     $ f: int  22 22 22 22 22 22 22 22 22 22 ...
     $ ID: int  1_23X 56_23X 1058_23X 567_23X 987_23X 574_23X 1001_23X...

,依此类推。

我认为我想念的数据框有一些重要概念。

我在哪里错了?

非常感谢您的支持。

1 个答案:

答案 0 :(得分:0)

使用tidyverse软件包有一种简单的方法:

第一个目标:

drop.na(df)

如果要将na_if转换为"",也可以使用NA

第二个目标:使用mutate创建一个新变量:

df <- df %>% 
 mutate(id = paste0(x_b$a, "_23X"))