【问题标题】:Creating variables by combining a vector of names and a vector of values [duplicate]通过组合名称向量和值向量来创建变量[重复]
【发布时间】:2019-07-02 06:27:59
【问题描述】:

我想创建一个向量/列表,其中包含一系列变量,这些变量是两个向量组合的结果,这些向量包含 (i) 特定变量名称和 (ii) 特定变量 ID(所有变量都相同)。 以下是这两个向量的简短版本: 变量名:

names<-c("XPTS", "TROCK", "JFSG")

以及变量 ID:

values<-c(1, 1.1, 1.2, 1.3, 2, 2.1, 2.2, 2.3, 3, 3.1, 3.2, 3.3, 4, 4.1, 4.2, 4.3, 5, 5.1, 5.2, 5.3, 6, 6.1, 6.2, 6.3, 7, 7.1, 7.2, 7.3, 8, 8.1, 8.2, 8.3, 9, 9.1, 9.2, 9.3, 10, 10.1, 10.2, 10.3, 11, 11.1, 11.2, 11.3, 12, 12.1, 12.2, 12.3, 13, 13.1, 13.2, 13.3, 14, 14.1, 14.2, 14.3, 15, 15.1, 15.2, 15.3, 16, 16.1, 16.2, 16.3, 17, 17.1, 17.2, 17.3, 18, 18.1, 18.2, 18.3, 19, 19.1, 19.2, 19.3, 20, 20.1, 20.2, 20.3, 21, 21.1, 21.2, 21.3, 22, 22.1, 22.2, 22.3, 23, 23.1, 23.2, 23.3, 24, 24.1, 24.2, 24.3, 25, 25.1, 25.2, 25.3, 26, 26.1, 26.2, 26.3, 27, 27.1, 27.2, 27.3, 28, 28.1, 28.2, 28.3, 29, 29.1, 29.2, 29.3, 30, 30.1, 30.2, 30.3, 31, 31.1, 31.2, 31.3, 32, 32.1, 32.2, 32.3, 33, 33.1, 33.2, 33.3, 34, 34.1, 34.2, 34.3, 35, 35.1, 35.2, 35.3, 36, 36.1, 36.2, 36.3, 37, 37.1, 37.2, 37.3, 38, 38.1, 38.2, 38.3, 39, 39.1, 39.2, 39.3, 40, 40.1, 40.2, 40.3, 41, 41.1, 41.2, 41.3, 42, 42.1, 42.2, 42.3, 43, 43.1, 43.2, 43.3, 44, 44.1, 44.2, 44.3, 45, 45.1, 45.2, 45.3, 46, 46.1, 46.2, 46.3, 47, 47.1, 47.2, 47.3, 48, 48.1, 48.2, 48.3, 49, 49.1, 49.2, 49.3, 50)

我希望获得如下的变量名列表:

"XPTS_1","XPTS_1.1","XPTS_1.2", ..., "XPTS_49.3","XPTS_50","TROCK_1","TROCK_1.1",...,"TROCK_49。 3","TROCK_50","JFSG_1","JFSG_1.1",...,"JFSG_49.3","JFSG_50"

变量名称不仅是报告的名称,而且可能会更改,因此我希望有一个动态循环来处理它。我写的如下,不符合我的目的:

variables_ID<-for (i in 1:length(values)) {
  paste(names, values[i], sep = "_")
}

因为我只得到了

“XPTS_50”“TROCK_50”“JFSG_50”

【问题讨论】:

    标签: r for-loop variables


    【解决方案1】:

    我们可以使用outer

    out1 <- c(t(outer(names, values, paste, sep="_")))
    

    注意:transposed 只是为了表明我们得到与rep 相同的结果


    或使用rep 复制“名称”,然后使用paste

    out2 <- paste(rep(names, each = length(values)), values, sep="_")
    all.equal(out1, out2)
    #[1] TRUE
    
    head(out1)
    #[1] "XPTS_1"   "XPTS_1.1" "XPTS_1.2" "XPTS_1.3" "XPTS_2"   "XPTS_2.1"
    tail(out1)
    #[1] "JFSG_48.3" "JFSG_49"   "JFSG_49.1" "JFSG_49.2" "JFSG_49.3" "JFSG_50"  
    

    或使用CJ

    library(data.table)
    CJ(names, values)[, paste(names, values, sep="_")]
    

    或者tidyverse

    library(tidyverse)
    crossing(names, values) %>%
         unite(names, names, values) %>% 
         pull(names)
    

    【讨论】:

    • 非常感谢您的建议,它非常接近我需要的结果,但它不能正确地实现我的目标,因为我需要变量按照我在向量中的顺序“名称”。我实际上需要将它们保存如下:XPTS_1","XPTS_1.1","XPTS_1.2", ..., "XPTS_49.3","XPTS_50","TROCK_1","TROCK_1.1",。 ..,"TROCK_49.3","TROCK_50","JFSG_1","JFSG_1.1",...,"JFSG_49.3","JFSG_50",而不是作为外部输出 ("XPTS_1" "TROCK_1 " "JFSG_1" "XPTS_1.1" "TROCK_1.1" "JFSG_1.1" 等等)
    • @EugenioAlladio 请检查输出。我得到相同的顺序
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-26
    • 1970-01-01
    • 2021-09-14
    • 2020-05-12
    相关资源
    最近更新 更多