【问题标题】:Functions, For Loops, and Conditionals in RR 中的函数、For 循环和条件
【发布时间】:2020-08-27 03:27:22
【问题描述】:

我得到了一个 .csv 数据集,我想使用 for 循环为数据建立一个函数。数据集有 5 列,数据由因子或数字组成。如果数据是一个因素,什么都不应该做,只需打印出列的名称和它的类。如果数据是数字,则打印出名称、类以及两个函数(我之前已经创建)。

我对如何组织函数/for循环的语法有点迷茫。

p.data <- read.csv("file.csv")
function(
x){
for.loop.variable <- for(index in data.csv){
if (class(x)) == "factor" 
{cat("Name of Column is:", names(x*), "\n", 
"Class of Column is :" , (class(x)))
} else {
cat("Name of Column is:", names(x*), "\n", 
"Class of Column is :" , (class(x)),"\n", 
"Function 1 is :", function.1(x), "\n",
"Function 2 is :", function.2(x), "\n")
}
}
}
return (for.loop.variable)

认为这是正确的设置,但我有 3 个问题我似乎无法弄清楚:

1- for 循环迭代如何发挥作用?我根本没有在条件句中引用它,我不知道该怎么做?

2*- 如何调用/打印列名?我不认为它是名称(x),但我不太确定它会是什么。

3- return () 是否正确?它是否应该从变量中返回整个 for 循环(一旦我弄清楚如何将其与实际问题联系起来)?

请让我知道在哪里修复错误,以便我可以正确学习。

这是示例代码的图像,因此就括号/语法而言,它更易于阅读:

【问题讨论】:

  • 您的目标仅仅是打印还是您有其他想法?
  • 只打印请求的内容:如果因素:名称和类。如果是数字:名称、类、函数 1 和 2 的结果。

标签: r function for-loop if-statement


【解决方案1】:
FunctionName <- function(x){
   for (col_n in 1:ncol(x)){
      if (class(x[col_n]=="factor"){
         cat("Name of Column is:", names(x[col_n]), "\n", 
             "Class of Column is :" , (class([col_n])))
      } else {
        cat("Name of Column is:", names(x[col_n]), "\n", 
            "Class of Column is :" , (class(x[col_n])),"\n", 
            "Function 1 is :", function.1(x[,col_n]), "\n",
            "Function 2 is :", function.2(x[,col_n]), "\n")
      }
   }
}

1- for 循环迭代如何发挥作用?我根本没有在条件句中引用它,我不知道该怎么做? 我不清楚你在这里的问题,但我相信你在这里问的是什么正在迭代。您的迭代器是 data.csv 的显式行(存储为 data.frame 或 data.table)。根据上下文,我认为您希望在通过打印语句时将文件读入函数(作为 x),您实际上是在打印正在循环的内容。

2*- 如何调用/打印列名?我不认为它是名称(x),但我不太确定它会是什么。 按照你编写函数的方式,这会有点困难。查看我的代码,了解我将如何进行此操作的示例。在我的代码中,x 是 data.csv(存储为 data.frame 或 data.table)并且只会将消息打印到屏幕上。我还假设您的函数需要整个列的输入-因此您可能需要一些麻烦。

3- return () 是否正确?它是否应该从变量中返回整个 for 循环(一旦我弄清楚如何将其与实际问题联系起来)? 这在一定程度上取决于您想要返回的内容。你设置它的方式我不清楚输出是什么。您的目标听起来就像您只想将信息打印到屏幕上。相反,如果您想使用所有消息创建一个变量,则可以将每条消息作为一行存储在变量中,并按照您编写的方式输出。

【讨论】:

    【解决方案2】:

    您遗漏了一些括号,看起来好像移到了错误的位置。我拿走了您的代码并对其进行了清理以帮助您进行比较。

    由于 R 中的 cat 直接打印到控制台,因此您不一定需要使用 return,实际上当我测试它时,return 做到了,所以只打印了循环的最后一次迭代。

     p.data <- read.csv("file.csv")
     for(i in seq_along(p.data)){
         x <- p.data[,i] #pull the individual column for this current iteration
    
        if (class(x) == "factor"){
            cat("Name of Column is:", x, "\n", 
                "Class of Column is :" , (class(x))
                )
                                  } else {
            cat("Name of Column is:", x, "\n", 
                "Class of Column is :" , (class(x)),"\n",
                "Function 1 is :", function.1(x), "\n",
                "Function 2 is :", function.2(x), "\n")
                                          }
                                }
    

    在 R 的 for 循环中执行此操作是可以的。根据你问的是谁,你可能会被告知 R 中的 for 循环非常慢。这是真的,如果你在没有预先分配对象内存的情况下构建数据帧或向量,它会非常慢。

    您可以使用的另一个工具是从包 purrr 中步行,但由于您要求 for 循环,我在 for 循环中完成了它,我将制作一个 walk 版本并更新它

    walk(p.data, function(x){
        if (class(x) == "factor"){
         cat("Name of Column is:", names(x), "\n", 
             "Class of Column is :" , (class(x)))
                                 } else {
      cat("Name of Column is:", names(x), "\n", 
          "Class of Column is :" , (class(x)),"\n"),
          "Function 1 is :", function.1(x), "\n",
          "Function 2 is :", function.2(x), "\n")
       }
      }
     )
    

    【讨论】:

      【解决方案3】:

      我打算让你开始慢一点,这里有一些基础知识。

      p.data <- mtcars
      p.data$cyl <- factor(p.data$cyl)
      
      for (i in seq_along(colnames(mtcars))) {
      
      #  print(colnames(p.data)[[i]])
      
        if (class(p.data[[i]]) == "factor") {
          print(colnames(p.data)[[i]])
        } else {
          print("nope")
        }
      
      }
      #> [1] "nope"
      #> [1] "cyl"
      #> [1] "nope"
      #> [1] "nope"
      #> [1] "nope"
      #> [1] "nope"
      #> [1] "nope"
      #> [1] "nope"
      #> [1] "nope"
      #> [1] "nope"
      #> [1] "nope"
      

      reprex package (v0.3.0) 于 2020-05-11 创建

      【讨论】:

        【解决方案4】:

        此代码打印下面的结果。

        # Sample data
        p.data <- data.frame(A = letters[1:5], B = 5:1, C = 1:5, D = LETTERS[5:9], stringsAsFactors = TRUE)
        
        # sample function
        function.1 <- mean
        function.2 <- sum
        
        # If the data is a factor, nothing should be done, just print out 
        # the name of the column and it's class. If the data is numeric, 
        # then print out the name, class, as well as two functions
        Descr <- function( x ) {
          for(index in 1:ncol(x)) {
              if (is.factor(x[[index]])) {
                cat("Name of Column is:", names(x[index]), "\n", 
                    "Type of Column is :" , class(x[index]), "\n")
              } else {
                cat("Name of Column is:", names(x[index]), "\n", 
                    "Type of Column is :" , (class(x[index])),"\n", 
                    "Function 1 is :", function.1(x[[index]]), "\n",
                    "Function 2 is :", function.2(x[[index]]), "\n")
              }
          }
        }
        
        Descr(p.data)
        

        列的名称是:A
        列类是:data.frame
        列名:B
        列类是:data.frame
        功能 1 是:3
        功能 2 是:15
        列的名称是:C
        列类是:data.frame
        功能 1 是:3
        功能 2 是:15
        列名:D
        列的类是:data.frame

        请注意,该类始终是“数据框”。您必须具体说明您需要知道的内容。

        【讨论】:

          【解决方案5】:

          我认为这个问题是出于教育目的,因此提出了一个简单的 for 循环:

          class_print <- function(df){
          
            for(i in 1:ncol(df)){
              if(is.factor(df[,i])){
                print(paste0("Name of column is ", names(df[i]), "class is factor ",collapse = ""))
              }
              else{
               print(paste("Name of column is ", names(df[i]),"class is ", class(df[,i]),collapse=""))
              }
          
            }
          
          }
          

          测试:

          class_print(iris)
          [1] "Name of column is  Sepal.Length class is  numeric"
          [1] "Name of column is  Sepal.Width class is  numeric"
          [1] "Name of column is  Petal.Length class is  numeric"
          [1] "Name of column is  Petal.Width class is  numeric"
          [1] "Name of column is Speciesclass is factor "
          

          【讨论】:

          • 我不熟悉 "collapse = """ 子句。您能否详细说明代码中的作用/意义?
          • collapse="" 表示我们希望将所有内容合并为一个字符串。在这里,我们将其留空,因为我们需要在同一行和同一句子中的所有内容。如果您使用collapse='\n' 之类的内容,则字符串将由换行符分隔,可以使用cat 打印,例如:cat(paste(c("I am a","They are"),c("factor","numeric"),sep="-",collapse = "\n"))。您可以查看更多详细信息here。我认为这更容易理解:paste(c("I am a","They are"),c("factor","numeric"),collapse = "-").
          猜你喜欢
          • 1970-01-01
          • 2020-11-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-01-01
          相关资源
          最近更新 更多