在for循环中,我试图在我的数据框中的两列数据之间运行一个函数,并在每次循环交互时移动到另一个数据集。我想将for循环的每个输出输出到一个答案向量中。
我无法通过以下错误(在我的代码下面列出),具体取决于我是否向数据< - read.csv ... 部分添加或删除row.names = NULL下面的代码(for循环的第4行):
**编辑包含目录引用,其中错误最终为:
corr <- function(directory, threshold = 0) {
source("complete.R")
以上代码/我看不见的目录组织是我的错误
lookup <- complete("specdata")
setwd(paste0(getwd(),"/",directory,sep=""))
files <-list.files(full.names="TRUE") #read file names
len <- length(files)
answer2 <- vector("numeric")
answer <- vector("numeric")
dataN <- data.frame()
for (i in 1:len) {
if (lookup[i,"nobs"] > threshold){
# TRUE -> read that file, remove the NA data and add to the overall data frame
data <- read.csv(file = files[i], header = TRUE, sep = ",")
#remove incomplete
dataN <- data[complete.cases(data),]
#If yes, compute the correlation and assign its results to an intermediate vector.
answer<-cor(dataN[,"sulfate"],dataN[,"nitrate"])
answer2 <- c(answer2,answer)
}
}
setwd( “../”) 返程(ANSWER2) }
1)read.table出错(file = file,header = header,sep = sep,quote = quote,: 不允许重复'row.names'
vs。)
2)[.data.frame
(数据,2:3)中的错误:选择了未定义的列
我尝试了什么
**谢谢!**
答案 0 :(得分:1)
我的问题是我有上面代码中引用的函数.R文件,与我循环和分析的数据文件位于同一目录中。我的文件&#34; vector是一个不正确的长度,因为它正在读取我之前在函数中创建和引用的另一个.R函数。我相信这个R文件是创建&#39;未定义列&#39;
的原因我道歉,最后我甚至没有在问题所在的地方放置正确的代码区域。
Key Takeaway:您可以随时在函数内的目录之间移动!事实上,如果你想对感兴趣的目录的所有内容执行一个函数,这可能是非常必要的
答案 1 :(得分:0)
一种方法:
# get the list of file names
files <- list.files(path='~',pattern='*.csv',full.names = TRUE)
# load all files
list.data <- lapply(files,read.csv, header = TRUE, sep = ",", row.names = NULL)
# remove rows with NAs
complete.data <- lapply(list.data,function(d) d[complete.cases(d),])
# compute correlation of the 2nd and 3rd columns in every data set
answer <- sapply(complete.data,function(d) cor(d[,2],d[,3]))
同样的想法,但实现略有不同
cr <- function(fname) {
d <- read.csv(fname, header = TRUE, sep = ",", row.names = NULL)
dc <- d[complete.cases(d),]
cor(dc[,2],dc[,3])
}
answer2 <- sapply(files,cr)
CSV文件示例:
# ==> a.csv <==
# a,b,c,d
# 1,2,3,4
# 11,12,13,14
# 11,NA,13,14
# 11,12,13,14
#
# ==> b.csv <==
# A,B,C,D
# 101,102,103,104
# 101,102,103,104
# 11,12,13,14