【问题标题】:how to use a loop in R with a non-numeric index如何在 R 中使用带有非数字索引的循环
【发布时间】:2021-02-27 19:24:56
【问题描述】:

给定 n 个数据帧,例如 (n=3) dfa、dfb、dfpt,我想执行以下操作:

dfa = dfa[, 'col1']
dfb = dfb[, 'col1']
dfpt = dfpt[, 'col1']

为什么要写一行代码,而不是 n 行。

我尝试了以下方法:

for(i in c('dfa', 'dfb', 'dfpt') {  df = df[, 'col1']  }

但我收到一条错误消息:维度数不正确。

【问题讨论】:

    标签: r loops for-loop


    【解决方案1】:

    这里的i 是字符串形式的对象名称。我们需要 get 提取对象的值。假设我们正在更新原始对象,那么使用assign

    for(i in c('dfa', 'dfb', 'dfpt')) assign(i, get(i)[, "col1"])
    

    【讨论】:

    • 谢谢! 'assign' 之前缺少一个括号
    • @pendermath 抱歉,这是一个错字。感谢您的报告。更新
    • 别抱歉@akrun,你成就了我的一天
    【解决方案2】:

    如果我理解正确

    set.seed(1)
    df1 <- data.frame(col1 = rnorm(10), col2 = rnorm(10))
    df2 <- data.frame(col1 = rnorm(10), col2 = rnorm(10))
    df3 <- data.frame(col1 = rnorm(10), col2 = rnorm(10))
    ldf <- list(df1, df2, df3)
    
    nm <- c("df1", "df2", "df3")
    library(tidyverse)
    map(ldf, ~.x[, "col1"]) %>% setNames(., nm)
    #> $df1
    #>  [1] -0.6264538  0.1836433 -0.8356286  1.5952808  0.3295078 -0.8204684
    #>  [7]  0.4874291  0.7383247  0.5757814 -0.3053884
    #> 
    #> $df2
    #>  [1]  0.91897737  0.78213630  0.07456498 -1.98935170  0.61982575 -0.05612874
    #>  [7] -0.15579551 -1.47075238 -0.47815006  0.41794156
    #> 
    #> $df3
    #>  [1] -0.1645236 -0.2533617  0.6969634  0.5566632 -0.6887557 -0.7074952
    #>  [7]  0.3645820  0.7685329 -0.1123462  0.8811077
    

    reprex package (v1.0.0) 于 2021 年 2 月 27 日创建

    【讨论】:

    • 谢谢,但这不是我需要的。我只想从所有 n 个数据框中删除除列 'col1' 之外的所有列;我不需要数据框列表。
    猜你喜欢
    • 2015-05-28
    • 1970-01-01
    • 2021-12-08
    • 2018-01-02
    • 2018-08-28
    • 2017-12-29
    • 2018-06-20
    • 2020-06-20
    • 2018-08-13
    相关资源
    最近更新 更多