【问题标题】:How to select a column in a for loop如何在for循环中选择一列
【发布时间】:2019-05-08 19:55:30
【问题描述】:

我有一个包含 310 个不同列的大数据框,在这里我创建了一个类似的小示例。 我会使用 for 循环选择“sp...”列。

`ex <-data.frame(ID=c(1,2,3,4,5,6,7,8,9,10),
            COD=c(1,8,4,5,6,8,7,2,8, 10),
            SP=c(10, 20, 40,50,60, 70,70,100,50, 40),
            sp010_hd=c(100,200,350,500,500,250,240, 680, 700, 300),
            sp300_he=c(100,500,650,500,500,250,260, 480, 700, 300),
            sp330_hg=c(100,500,650,500,500,250,260, 480, 700, 300),
            sp330_cc=c(100,500,650,500,500,250,260, 480, 700, 300),
            hd_bio_4=c(208.92,248.10,151.95, 130.01,90.01, 
            140.01,150.09,400.25, 300.00,100.50),
            hd_bio_6=c(207.92,208.10,161.95, 170.01,190.01, 
            120.01,155.09,200.25, 100.00,100.50),
            hd_bio_7=c(227.92,218.10,161.95, 170.01,150.01, 
            150.71,160.09,220.25, 120.00,108.50),
            he_bio_4=c(208.92,248.10,151.95, 140.01,60.01, 
            160.01,157.09,420.25, 300.00,100.50),
            he_bio_6=c(257.92,238.10,131.95, 130.01,160.01, 
            125.01,155.09,220.25, 100.00,100.50),
            he_bio_7=c(227.92,218.10,161.95, 130.01,150.01, 
            100.71,165.09,220.25, 120.00,108.50)))`

`

对于每一列,我想应用 lm() 函数。我尝试了一些尝试,但没有成功。 谁能帮我? 谢谢

【问题讨论】:

  • 你的因变量和自变量是什么?
  • 我更新了脚本。因变量是列 "sp ..." 。在原始数据框中,我为每个不同的变量组有 19 个不同的“sp ...”列(这里我为每个不同的组报告一个变量)。而预测变量是列“hd ....”和“he ...”。

标签: r for-loop dynamic-columns


【解决方案1】:

你可以使用purrr::map:

library(tidyverse)

ivs <- colnames(ex %>% select(-ID, -COD, -SP)) 
names(ivs) <- ivs

ivs %>% purrr::map_dfr(~lm(ex$SP ~ ex[,.x]) %>% broom::tidy(), .id = "iv")

注意:如果我们将term 列设置为实际报告使用的变量,则输出更具可读性。为此,请在对lm() 的调用中使用data 参数:

ivs %>% map_dfr(~lm(SP ~ ., data = ex[,c(.x, "SP")]) %>% broom::tidy(), .id = "iv")

输出:

# A tibble: 20 x 6
   iv       term        estimate std.error statistic p.value
   <chr>    <chr>          <dbl>     <dbl>     <dbl>   <dbl>
 1 sp010_hd (Intercept)  22.0      15.5        1.42   0.192 
 2 sp010_hd sp010_hd      0.0758    0.0362     2.10   0.0694
 3 sp300_he (Intercept)  42.6      22.1        1.93   0.0896
 4 sp300_he sp300_he      0.0199    0.0479     0.415  0.689 
 5 sp330_hg (Intercept)  42.6      22.1        1.93   0.0896
 6 sp330_hg sp330_hg      0.0199    0.0479     0.415  0.689 
 7 sp330_cc (Intercept)  42.6      22.1        1.93   0.0896
 8 sp330_cc sp330_cc      0.0199    0.0479     0.415  0.689 
 9 hd_bio_4 (Intercept)  36.7      19.1        1.92   0.0913
10 hd_bio_4 hd_bio_4      0.0742    0.0897     0.828  0.432 
11 hd_bio_6 (Intercept)  65.0      35.9        1.81   0.108 
12 hd_bio_6 hd_bio_6     -0.0866    0.216     -0.401  0.699 
13 hd_bio_7 (Intercept)  65.5      38.2        1.72   0.124 
14 hd_bio_7 hd_bio_7     -0.0860    0.220     -0.390  0.707 
15 he_bio_4 (Intercept)  36.0      18.2        1.98   0.0833
16 he_bio_4 he_bio_4      0.0772    0.0831     0.929  0.380 
17 he_bio_6 (Intercept)  68.6      26.7        2.57   0.0332
18 he_bio_6 he_bio_6     -0.109     0.156     -0.695  0.507 
19 he_bio_7 (Intercept)  67.8      31.6        2.15   0.0640
20 he_bio_7 he_bio_7     -0.105     0.190     -0.553  0.596 

【讨论】:

  • 感谢您的回答。我试过了,我认为这符合我的想法。只是几个问题,以便更好地理解。我的第一个关于最终输出的问题,为什么每列分析两行?第二个关于模型的预测变量,您是如何定义它们的?
  • 不客气。我解释您的问题的方式是,您想对数据中的每一列运行单独的回归,每次使用一个预测变量/IV(特定列)并且响应/DV 为SP。这就是它的作用。具有一个预测变量的回归将产生两个系数:一个用于截距,一个用于预测变量。这就是每个预测变量有两行的原因。至于你的第二个问题,我不确定我是否理解 - 每个回归中的预测变量由列向量(he_bio_4he_bio_6 等)定义。这能回答你的问题吗?
  • 抱歉我的迟到,谢谢你的解释。这就是我一直在寻找的
【解决方案2】:

使用dplyr 包和starts_with() 函数可以轻松地仅选择带有“sp”前缀的列:

ex <-data.frame(ID=c(1,2,3,4,5,6,7,8,9,10),
               COD=c(1,8,4,5,6,8,7,2,8, 10),
               SP=c(10, 20, 40,50,60, 70,70,100,50, 40),
               sp010_hd=c(100,200,350,500,500,250,240, 680, 700, 300),
               sp300_he=c(100,500,650,500,500,250,260, 480, 700, 300),
               sp330_hg=c(100,500,650,500,500,250,260, 480, 700, 300),
               sp330_cc=c(100,500,650,500,500,250,260, 480, 700, 300))


library(dplyr)
select(ex, starts_with("sp"))

如果您想扩展它以对每个执行回归,您可以使用 lapply()purrr::map(),如下所示:

#Use gather to get all the prefixes in one column with values in another,
#then use map() to do a linear model on each group
ex %>% 
  gather(key = sp_number, value = whatever_units, starts_with("sp", ignore.case = FALSE)) %>% 
  group_by(sp_number) %>% 
  nest() %>% 
  mutate(lm_results = map(data, ~lm(whatever_units ~ SP, data = .)),
         tidy_results = map(lm_results, broom::tidy)) %>% 
  unnest(tidy_results)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-06
    • 2017-10-03
    • 2013-06-02
    • 2021-03-20
    • 1970-01-01
    • 1970-01-01
    • 2020-12-24
    相关资源
    最近更新 更多