【问题标题】:How to create independent different data.frame in a loop R如何在循环R中创建独立的不同data.frame
【发布时间】:2019-12-10 16:09:26
【问题描述】:

大家晚上好,

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

我一步一步编写代码(它有效),但我认为,也许有一种方法可以用 for 压缩代码。

x 是我原来的data.frame

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==""), ]

在此之后,第二个目标是为每个新的 data.frame 创建一个我使用函数 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...

等等。

我认为我错过了有关数据框的一些重要概念。

我哪里错了?

非常感谢您的支持。

【问题讨论】:

    标签: r dataframe


    【解决方案1】:

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

    第一个目标:

    drop.na(df)
    

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

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

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

    【讨论】:

    • 非常感谢@novica 的回答。请您对“第二个目标”更准确一些。
    • 嘿@Befrancesco 我刚刚注意到我的回复中有一些拼写错误。解决了这个问题。你能告诉我你需要更精确吗?
    • 您好@novica 我想了解如何将您的代码放入 for 循环中。提前感谢您的时间:)
    • 啊,@Befrancesco 无需将其放入 for 循环中。 mutate 将遍历每一行并创建一个新变量。在此处查看一些示例:dplyr.tidyverse.org/reference/mutate.html
    • 好的。我认为这个答案有你所需要的:stackoverflow.com/questions/33180753/…
    猜你喜欢
    • 2020-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-15
    • 1970-01-01
    • 1970-01-01
    • 2017-06-09
    相关资源
    最近更新 更多