【问题标题】:Subtraction of pairs of columns based on corresponding variable names, using for loop (in R)使用 for 循环(在 R 中)根据相应的变量名称减去列对
【发布时间】:2018-09-02 18:10:43
【问题描述】:

我有一个包含变量名称的宽格式数据框,例如 "per601.199003"(它们都以 "per" 开头,后跟 3-4 位数字,句号 . 和表示某个日期的数字) .

现在对于每对 "per601...""per602..." 变量,我需要从前者中减去后者:"per601..." - "per602..."

有匹配的结尾(例如"per601.199003""per602.199003"),但也有其他结尾我只有"per601..."- 或"per602..."- 版本。

为了重现性,也为了简单起见,假设这是我的两个变量名列表(我使用grep() 获得它们)。实际上,这两个列表显然要长得多。

vars_601 <- c("per601.199003", "per601.200201", "per601.2001409")
vars_602 <- c("per602.199003", "per602.200201", "per602.2001702")

现在我需要的是这样的:

for (i in per_601_list) {
  #search corresponding item in per_602_list (i.e. same ending)
  #subtract this latter item from the first item
}

【问题讨论】:

    标签: r for-loop subtraction


    【解决方案1】:

    我不知道你的per_60x_lists 应该是什么,所以让我使用列名的字符向量:

    vars_601 <- c("per601.199003", "per601.200201", "per601.2001409")
    vars_602 <- c("per602.199003", "per602.200201", "per602.2001702")
    

    我需要一些示例数据来处理,所以我将使用这些列名构建一个名为 df 的数据框:

    df <- as.data.frame(matrix(sample(1:100, 60, T), 10, 6))
    names(df) <- c(vars_601, vars_602)
    

    现在为您的循环。我们首先使用grep检查每个601列是否有对应的602列,如果是,我们使用df[paste()]减去并分配一个新变量:

    for(i in seq_along(vars_601)) {
        # get the i'th 601 date
        thisdate <- substr(vars_601[i], 8, nchar(vars_601[i]))
    
        # check if there is a matching 602 date
        ismatch <- sum(grepl(paste0("*", thisdate), vars_602)) > 0
    
        # if there's a match, subtract: diff.date = 601.date - 602.date
        if(ismatch) {
            df[paste0("diff.", thisdate)] <- df[paste0("per601.", thisdate)] - 
                                             df[paste0("per602.", thisdate)]
        }
    }
    

    或者,不循环,只需在一个数据帧中获取匹配的 601 列,在另一个数据帧中获取匹配的 602 列,并(在确保列的顺序正确后)减去两个数据帧:

    var_601_dates <- substr(vars_601, 8, 14)
    var_602_dates <- substr(vars_602, 8, 14)
    
    df[ , sort(vars_601[var_601_dates %in% var_602_dates])] - 
    df[ , sort(vars_602[var_602_dates %in% var_601_dates])]
    

    【讨论】:

    • 看起来不错,谢谢。我并不完全理解 for 循环的所有部分,但至少对于示例数据,它起到了作用。由于我的数据是宽格式的,我想我可以将它整形回长,然后简单地从另一个变量中减去一个变量,这要容易得多......但考虑到我在宽格式上苦苦挣扎,这也有点令人沮丧这么久了……
    • 顺便感谢lists 的评论。你是绝对正确的。我编辑了那部分并用字符向量替换了它。
    • 我将 cmets 添加到 for 循环以帮助您完成它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-14
    • 2017-05-13
    • 2021-01-21
    • 1970-01-01
    • 1970-01-01
    • 2021-12-03
    • 1970-01-01
    相关资源
    最近更新 更多