无论如何,我使用R读取6 excel pokemon excel表中的多个.csv文件?

问题描述 投票:0回答:1

我正在尝试在R中练习编程功能。我已经创建了一个函数,允许我确定每个给定类型的口袋妖怪(例如水,通灵等)的每个属性(例如攻击,速度,防御等)的最佳口袋妖怪。 )。到目前为止,我只能为一个口袋妖怪一代做这个(反映在一个excel文件中)。我想做同样的事情来包括所有6代(存储在6个excel文件中)。我一直在研究代码...也许这里的任何人都可以提供一些输入?这是我在R中用于所述函数的当前代码:

bestpoke<-function(Type1, attri){
    data <- read.csv("gen01.csv", colClasses = "character", header=TRUE)
    dx   <- as.data.frame(cbind(data[, 2],   # Name
                                data[, 3],   # Type1
                                data[, 6],   # HP
                                data[, 7],   # Attack
                                data[, 8],   # Defense
                                data[, 9],   # SpecialAtk
                                data[, 10],  # SpecialDef
                                data[, 11]), # Speed
                          stringsAsFactors = FALSE)
    colnames(dx) <- c("Name", "Type1", "HP", "Attack", "Defense", "SpecialAtk","SpecialDef", "Speed")
    ## Check that name and attributes are valid
    if(!Type1 %in% dx[, "Type1"]){
      stop('invalid Type')
    } else if(!attri %in% c("HP", "Attack", "Defense", "SpecialAtk", "SpecialDef", "Speed")){
      stop('invalid attribute')
    } else {
      da <- which(dx[, "Type1"] == Type1)
      db <- dx[da, ]    # extracting data for the called state
      dc <- as.numeric(db[, eval(attri)])
      max_val <- max(dc, na.rm = TRUE)
      result  <- db[, "Name"][which(dc == max_val)]
      output  <- result[order(result)]
    }
    return(output)   }
r
1个回答
1
投票

首先,我相信您可以稍微简化一下代码,尤其是在定义对象数据和dx时。

data <- read.csv("gen01.csv", stringsAsFactors = F)

您可以使用F或T代替False或True。 read.csv()函数具有stringsAsFactors参数,因此所有字符列都将作为字符读取,数字列将保持数字。默认情况下,函数中的header参数为True。此外,read.csv()函数的输出通常是data.frame,因此您不必在此时使用as.data.frame函数。有关更多信息,请在R控制台中运行“?read.csv”。然后,您可以使用以下内容对所需的列进行子集化:

dx <- data[, c(2, 3, 6:11)]

colnames(dx) <- c("Name", "Type1", "HP", "Attack", "Defense", "SpecialAtk","SpecialDef", "Speed")
#This last line is just fine if you want to change the names of the columns.
#You can use the function names() instead, but I think that they work the same way.

现在,指的是其他几代人,我认为你可以练习一些条件if else。首先安装xlsx包和readxl包,这样您就不必将excel文件导出为csv格式。您可以尝试添加一个新参数“gen”或“generation”,例如,需要1到6的数字输入,并执行以下操作:

bestpoke<-function(Type1, attri, gen = 1){ # First generation will be the default

require(readxl)

if(gen == 1) {
data <- read.csv("gen01.csv", stringsAsFactors = F)
} else if(gen == 2) {
data <- read_xls("gen02.xls", stringsAsFactors = F)
} else if(gen == 3) { } # And so on...

dx <- data[, c(2, 3, 6:11)]

colnames(dx) <- c("Name", "Type1", "HP", "Attack", "Defense", "SpecialAtk","SpecialDef", "Speed")
## From this point your function is the same

这假设所有文件具有相同的结构(数量和顺序以及列类型)。

您可能想尝试其他一些事情,但如果您正在学习,那么您最好自己寻找一些方法来完成它们。这可能是:

  • 阅读和合并两代或更多代(如果问题是两代或更多代之间最好的口袋妖怪)。在这种情况下,条件必须改变。

祝好运!

© www.soinside.com 2019 - 2024. All rights reserved.