【问题标题】:Concatenate 3 columns as Linear Regression Model将 3 列连接为线性回归模型
【发布时间】:2018-08-20 21:27:20
【问题描述】:

这是我的数据框:

df.index= dput(df.index)
    structure(list(Var1 = structure(c(43L, 42L, 46L, 33L, 29L), .Label = c("ABEV3", 
    "AEDU3", "ALLL3", "BBAS3", "BBDC3", "BBDC4", "BISA3", "BRAP4", 
    "BRFS3", "BRKM5", "BRML3", "BRPR3", "BVMF3", "CCRO3", "CESP6", 
    "CIEL3", "CMIG4", "CPFE3", "CPLE6", "CRUZ3", "CSAN3", "CSNA3", 
    "CTIP3", "CYRE3", "DASA3", "DTEX3", "ECOR3", "ELET3", "ELET6", 
    "ELPL4", "EMBR3", "ENBR3", "ESTC3", "EVEN3", "FIBR3", "GFSA3", 
    "GGBR4", "GOAU4", "GOLL4", "HGTX3", "HYPE3", "ITSA4", "ITUB4", 
    "JBSS3", "KLBN4", "KROT3", "LAME4", "LIGT3", "LREN3", "MRFG3", 
    "MRVE3", "NATU3", "OIBR4", "PCAR4", "PDGR3", "PETR3", "PETR4", 
    "QUAL3", "RENT3", "RSID3", "SANB11", "SBSP3", "SUZB5", "TBLE3", 
    "TIMP3", "UGPA3", "USIM5", "VALE3", "VALE5", "VIVT4"), class = "factor"), 
        Var2 = structure(c(42L, 43L, 33L, 46L, 28L), .Label = c("ABEV3", 
        "AEDU3", "ALLL3", "BBAS3", "BBDC3", "BBDC4", "BISA3", "BRAP4", 
        "BRFS3", "BRKM5", "BRML3", "BRPR3", "BVMF3", "CCRO3", "CESP6", 
        "CIEL3", "CMIG4", "CPFE3", "CPLE6", "CRUZ3", "CSAN3", "CSNA3", 
        "CTIP3", "CYRE3", "DASA3", "DTEX3", "ECOR3", "ELET3", "ELET6", 
        "ELPL4", "EMBR3", "ENBR3", "ESTC3", "EVEN3", "FIBR3", "GFSA3", 
        "GGBR4", "GOAU4", "GOLL4", "HGTX3", "HYPE3", "ITSA4", "ITUB4", 
        "JBSS3", "KLBN4", "KROT3", "LAME4", "LIGT3", "LREN3", "MRFG3", 
        "MRVE3", "NATU3", "OIBR4", "PCAR4", "PDGR3", "PETR3", "PETR4", 
        "QUAL3", "RENT3", "RSID3", "SANB11", "SBSP3", "SUZB5", "TBLE3", 
        "TIMP3", "UGPA3", "USIM5", "VALE3", "VALE5", "VIVT4"), class = "factor"), 
        time = structure(c(1L, 1L, 1L, 1L, 1L), class = "factor", .Label = "t")), class = "data.frame", row.names = c(NA, 
    -5L))

是这样的:

   Var1  Var2 time
1 ITUB4 ITSA4    t
2 ITSA4 ITUB4    t
3 KROT3 ESTC3    t
4 ESTC3 KROT3    t
5 ELET6 ELET3    t

我想将这 3 列连接成这样的文本:

"ITUB4~ITSA4+t" "ITSA4~ITUB4+t" "KROT3~ESTC3+t" "ESTC3~KROT3+t" "ELET6+ELET3+t"

我正在使用apply函数:

df.index=apply(df.index,1,paste,collapse="~+")

但结果是错误的。问题是我无法使用“+”符号将第二列与第三列分开。如何用“+”符号将第二个变量与“t”变量分开?

我想要的结果是:

"ITUB4~ITSA4+t" "ITSA4~ITUB4+t" "KROT3~ESTC3+t" "ESTC3~KROT3+t" "ELET6+ELET3+t"

如上所述。

【问题讨论】:

标签: r


【解决方案1】:

我们可以使用paste

with(df.index, paste0(Var1, "~", Var2, "+", time))
#[1] "ITUB4~ITSA4+t" "ITSA4~ITUB4+t" "KROT3~ESTC3+t" "ESTC3~KROT3+t" "ELET6~ELET3+t"

正如 OP 提到的使用 apply 获取结果,将 MARGIN 指定为 1 表示逐行,然后在数据集的每一行中应用 pastepaste 是矢量化的,效率会降低

apply(df.index, 1, FUN = function(x) paste0(x[1], "~", x[2], "+", x[3]))

【讨论】:

  • "Var2" 应该是Var2
  • @akrun 是否可以使用 apply 功能做到这一点?
  • @DiogoBastos 是的,你可以做到,但效率会降低,即apply(df.index, 1, function(x) paste0(x[1], "~", "x[2], "+", x[3]))
【解决方案2】:

如果你想要一个公式(类公式),你可以这样。请注意,我首先将您的所有因素更改为带有mutate_if的字符

library(tidyverse)

df <- df %>% mutate_if(is.factor, as.character) %>%
  mutate(forms = map2(Var1, Var2, ~reformulate(c(.y, "t"), .x, TRUE)))
df
#>    Var1  Var2 time             forms
#> 1 ITUB4 ITSA4    t ITUB4 ~ ITSA4 + t
#> 2 ITSA4 ITUB4    t ITSA4 ~ ITUB4 + t
#> 3 KROT3 ESTC3    t KROT3 ~ ESTC3 + t
#> 4 ESTC3 KROT3    t ESTC3 ~ KROT3 + t
#> 5 ELET6 ELET3    t ELET6 ~ ELET3 + t

df$forms
#> [[1]]
#> ITUB4 ~ ITSA4 + t
#> <environment: 0x7fe3b5854c88>
#> 
#> [[2]]
#> ITSA4 ~ ITUB4 + t
#> <environment: 0x7fe3b583d1a8>
#> 
#> [[3]]
#> KROT3 ~ ESTC3 + t
#> <environment: 0x7fe3b58352f8>
#> 
#> [[4]]
#> ESTC3 ~ KROT3 + t
#> <environment: 0x7fe3b58333a8>
#> 
#> [[5]]
#> ELET6 ~ ELET3 + t
#> <environment: 0x7fe3b581c8a8>

reprex package (v0.2.0) 于 2018 年 8 月 20 日创建。

【讨论】:

    猜你喜欢
    • 2019-10-09
    • 2021-08-05
    • 2021-01-11
    • 1970-01-01
    • 1970-01-01
    • 2021-12-19
    • 1970-01-01
    • 1970-01-01
    • 2018-04-28
    相关资源
    最近更新 更多