【问题标题】:How to find common variables in a list of datasets & reshape them in R?如何在数据集列表中找到公共变量并在 R 中重塑它们?
【发布时间】:2016-11-02 20:10:02
【问题描述】:
    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 结尾的变量,并返回包含这些变量的数据库列表。

现在我很不确定如何做到这一点,我对编码和 R 很陌生。

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

【问题讨论】:

    标签: r loops variables dataset reshape


    【解决方案1】:

    首先,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)。

    【讨论】:

    • 感谢您的回答!但是我如何实际查看我们保存名称的列表呢?现在它似乎在我的“值”下数据下方的“全球环境”选项卡中。
    • 你是对的,名字在向量 myList 中。您可以随意访问它,但在提示符下键入 myList 将在控制台中显示其内容。
    • 好的,现在我得到了一个包含我需要的变量的数据集列表。现在,如果我想从这个新列表中提取所有名为 'a' 、 'b' 或包含模式 "_m" 的数据集中的所有列并将它们放入新数据集中怎么办?
    • 我想也许我可以这样做,将文件的内容保存在数据框中,在循环内键入:m
    • 你会像以前一样做,但使用 OR 运算符的不同正则表达式:grep( '^(a|b|_m)*$', colnames(df), value=TRUE) 应该可以工作。它在每个列名的 beg(符号 ^)和结尾(符号 $)之间查找 a、b 或 _m(括号中的 OR 语句)至少出现一次(符号 *)。
    【解决方案2】:

    这是确定哪些文件的变量名称以“_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 的逻辑向量,指示是否至少有一个TRUE 从 grepl 返回。

    # print out these file names    
    temp[inFileVec]
    

    【讨论】:

    • 感谢您的回答!最后一行 'temp[inFileVec]' 只是说 'character(0)' 作为输出,这是什么意思?
    • 尝试打印出循环中列的名称:cat(names(fileTemp))
    • 嗯,它给出了一堆变量名,但没有一个奇怪地与“_m”模式匹配..
    • 所以没有一个变量名,可能是read.dta13读入时翻译的,使用那个模式。最后有“.m”模式吗?如果是这样,请改用 grepl 中的“\\.m$”。
    • 我确定有 _m 模式,无论我作为模式给出什么,它都会给出相同的变量。此外,似乎 fileTemp 只是数据集之一,所以在遍历每个文件时可能会出现问题?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多