R 我正在尝试创建一个函数,检查每个列类别中有多少na,如果超过20%的条目为空,则删除该列

R 我正在尝试创建一个函数,检查每个列类别中有多少na,如果超过20%的条目为空,则删除该列,r,R,我在R为一个商业房地产项目编程,从我开始工作的地方开始。我有一个数据框,上面有195个类别,分别对应于去年该地区销售的每一处房产。类别沿顶部,属性沿行 我尝试创建一个名为cuttingvariables1的函数,首先根据列名中是否有卖家、买家、买家来获取类别的子集,从而减少变量的数量 当我以命令的形式运行它时,它能够工作,但是当我试图在源文件中生成函数并运行它时,为什么它不能工作呢 Cuttingvariables2是我的第二个函数,我不明白为什么它在第7行停止工作。循环用于检查每个类别的每个n

我在R为一个商业房地产项目编程,从我开始工作的地方开始。我有一个数据框,上面有195个类别,分别对应于去年该地区销售的每一处房产。类别沿顶部,属性沿行

我尝试创建一个名为
cuttingvariables1
的函数,首先根据列名中是否有卖家、买家、买家来获取类别的子集,从而减少变量的数量

当我以命令的形式运行它时,它能够工作,但是当我试图在源文件中生成函数并运行它时,为什么它不能工作呢

Cuttingvariables2
是我的第二个函数,我不明白为什么它在第7行停止工作。循环用于检查每个类别的每个na_计数,然后查看它是否大于加载的csv中列出的属性数的20%。如果是,则该列将被删除

任何帮助都将不胜感激

cuttingvariables1 <- function(dataset) 

(

dataset <- (subset(dataset,select=c(!grepl("Seller|Buyer|Buyers|Listing",names(dataset))))

)

)


Cuttingvariables2 function below!

cuttingvariables2 <- function(dataset)

{

z = ncol(dataset)

na_count <- c(lapply(dataset, function(y) sum(length(which(is.na(y))))))

setDT(na_count, keep.rownames = TRUE)[]

j = ncol(na_count)

for (i in 1:j) if((as.integer(na_count[,i])) > (nrow(dataset)/5)) na_count <- na_count[,-i]

for (i in 1:ncol(dataset)) if(colnames(dataset)[i] %in% (colnames(na_count))) dataset <- dataset[,-i]

return (dataset[1:5,1:5])

return (colnames(dataset)) 
}

#sample data
BROWNSVILLEMF2016TO2017[1:12,1:5]

 Actual.Cap.Rate Age Asking.Price Assessed.Improved Assessed.Land
1               NA  31           NA          12039000       1776000
2               NA  NA           NA           1434000       1452000
3               NA  87           NA            306900        270000
4               NA  11           NA            432900        337950
5               NA  89           NA            281700        107100
6              4.5  87      3300000                NA            NA
7               NA  96           NA            427500         66150
8               NA  87           NA           1228000        300000
9               NA  95           NA                NA            NA
10              NA  95           NA                NA            NA
11              NA  87           NA            210755         14418
12              NA  87           NA                NA            NA

cuttingvariables1我不会直接在grep中使用subset,因为您有这么多字段。这些词可能有非常不同的版本,你需要它们,不管它们是否大写

(一定要检查我的R语法,因为我整天都在用python工作)

#空列表-您将构建一个名称列表

extractListtry使用带有{}的实代码,并给出要测试的示例数据。如果你正在寻找有意义的反馈,那就是获得反馈的方法。数据,使用您正在处理的列名和可靠的代码…然后您将得到您希望的帮助。这是我第一次用这个。如果要将示例数据编辑为函数,请在函数外部创建名称列表,并让函数接受数据框和列表,则将使用示例数据进行编辑。这样的话,你可以给它任何两帧任何你想要的话,它将工作哇,这是做得非常干净。我理解这些命令中的每一个,但我最终将代码过度复杂,以至于它停止工作。你推荐哪本书让我更好地从头开始编写代码?谢谢!老实说,我自己花了一些时间在它上面,并对它进行了测试。我正处于这样一个阶段,我正试图从“完成任务”转变为以老板或同事能够理解、阅读和重用的方式完成任务……我会寻找问题来挑战我,但我应该能够做好。你也会到达那里的。有几本书还不错。(当然)Hadly Wickham的R for Data Science在线免费提供:我已经每天使用它18个月了。这很有帮助,Datacamp.com价格实惠,而且很快就能到达那里,每月25美元。你对此有什么想法吗?>#创建外部循环以获取列的索引,并一次从每个列中提取列名>(i在数据集中){+cName
#Empty List - you will build a list of names 
extractList<-list()

#names you are looking for in column names saved as a list (lowercase)   
nameList<- c("seller","buyer","buyers","listing")

#Create the outer loop to grab index of columns and pull the column name off each one at a time    
    for (i in 1:ncol(dataset)){ 
     cName<-names(dataset[i])
     lcName<-tolower(cName)
#Created a loop within that loop to compare each keyword on your nameList to the columns to see if the word is in the title (with title case lowered)
     for (j in nameList){
 #if it is append the column name to the list NOT LOWER CASE, ***ORIGINAL***
          if(grepl(j, lcName)==TRUE ){extractList=append(cName,extractList)}
     } }
#Now remove duplicates names for the extract list
extractList<-unique(extractlist)
newSet<- dataset[,which((names(dataset) %in% extractList)==TRUE)