setwd("C:\\Users\\DATA")
temp = list.files(pattern="*.dta")
for (i in 1:length(temp)) assign(temp[i], read.dta13(temp[i], nonint.factors = TRUE))
grep(pattern="_m", temp, value=TRUE)
在这里,我创建了一个我的数据集列表并将它们读入R,然后我尝试使用grep
来查找带有模式_m的所有变量名称,显然这不起作用,因为这只是返回所有文件名与模式_m。基本上我想要的是,我的代码循环遍历数据库列表,查找以_m结尾的变量,并返回包含这些变量的数据库列表。
现在我很不确定如何做到这一点,我对编码和R.很新。
除了需要知道这些变量在哪些数据库中之外,我还需要能够对这些变量进行更改(重塑它们)。
答案 0 :(得分:0)
这是一种找出哪些文件的变量名称以" _m":
结尾的方法# setup
setwd("C:\\Users\\DATA")
temp = list.files(pattern="*.dta")
# logical vector to be filled in
inFileVec <- logical(length(temp))
# loop through each file
for (i in 1:length(temp)) {
# read file
fileTemp <- read.dta13(temp[i], nonint.factors = TRUE)
# fill in vector with TRUE if any variable ends in "_m"
inFileVec[i] <- any(grepl("_m$", names(fileTemp)))
}
在最后一行中,names
返回变量名称,grepl
返回每个变量名称是否与模式匹配的逻辑向量,any
返回长度为1的逻辑向量是否从grepl
返回了至少一个TRUE。
# print out these file names
temp[inFileVec]
答案 1 :(得分:0)
首先,assign
将无法正常工作,因为它需要一个字符串(或字符,因为它们在R中调用)。它将使用第一个元素作为变量(有关详细信息,请参阅here)。
您可以做什么取决于数据的结构。 read.dta13将每个文件加载为data.frame。
如果您查找列名称,可以执行以下操作:
myList <- character()
for (i in 1:length(temp)) {
# save the content of your file in a data frame
df <- read.dta13(temp[i], nonint.factors = TRUE))
# identify the names of the columns matching your pattern
varMatch <- grep(pattern="_m", colnames(df), value=TRUE)
# check if at least one of the columns match the pattern
if (length(varMatch)) {
myList <- c(myList, temp[i]) # save the name if match
}
}
如果查找列的内容,可以查看dplyr包,这在数据帧操作方面非常有用。
包小插图here中提供了对dplyr的一个很好的介绍。
请注意,在R中,附加到矢量可能会变得非常慢(有关详细信息,请参阅此SO question)。