如何在数据集列表中找到公共变量并在 R 中重塑它们?
How to find common variables in a list of datasets & reshape them in R?
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 的变量名称,显然这不起作用,因为这只是 returns 模式为 _m 的所有文件名。所以基本上我想要的是我的代码循环遍历数据库列表,查找以 _m 结尾的变量,以及 return 包含这些变量的数据库列表。
现在我不太确定该怎么做,我对编码和 R 还很陌生。
除了需要知道这些变量在哪些数据库中之外,我还需要能够对这些变量进行更改(重塑)。
这是一种确定哪些文件的变量名称以“_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
returns 变量名,grepl
returns 一个逻辑向量,表示每个变量名是否与模式匹配,any
returns 长度为 1 的逻辑向量,指示是否从 grepl
.
返回了至少一个 TRUE
# print out these file names
temp[inFileVec]
首先,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 包,它在数据帧操作方面非常有用。
包 vignette here.
中提供了对 dplyr 的一个很好的介绍
请注意,在 R 中,附加到向量可能会变得非常慢(有关详细信息,请参阅此 SO question)。
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 的变量名称,显然这不起作用,因为这只是 returns 模式为 _m 的所有文件名。所以基本上我想要的是我的代码循环遍历数据库列表,查找以 _m 结尾的变量,以及 return 包含这些变量的数据库列表。
现在我不太确定该怎么做,我对编码和 R 还很陌生。
除了需要知道这些变量在哪些数据库中之外,我还需要能够对这些变量进行更改(重塑)。
这是一种确定哪些文件的变量名称以“_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
returns 变量名,grepl
returns 一个逻辑向量,表示每个变量名是否与模式匹配,any
returns 长度为 1 的逻辑向量,指示是否从 grepl
.
# print out these file names
temp[inFileVec]
首先,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 包,它在数据帧操作方面非常有用。
包 vignette here.
中提供了对 dplyr 的一个很好的介绍请注意,在 R 中,附加到向量可能会变得非常慢(有关详细信息,请参阅此 SO question)。