如何在数据集列表中查找公共变量&在R中重塑它们?

时间:2016-06-30 15:53:04

标签: r loops variables dataset reshape

    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.很新。

除了需要知道这些变量在哪些数据库中之外,我还需要能够对这些变量进行更改(重塑它们)。

2 个答案:

答案 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)。