我正在尝试在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) }
首先,我相信您可以稍微简化一下代码,尤其是在定义对象数据和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
这假设所有文件具有相同的结构(数量和顺序以及列类型)。
您可能想尝试其他一些事情,但如果您正在学习,那么您最好自己寻找一些方法来完成它们。这可能是:
祝好运!