【问题标题】:use object name in a loop在循环中使用对象名称
【发布时间】:2012-05-09 07:07:42
【问题描述】:

我正在合并一些存储在列表中的数据帧。为此,我使用带有.df 命令的for 循环。现在,我想在循环中的paste 中使用数据框的名称为suffixes

有没有办法,使用for ( .df in [list]) { 命令,我可以减去当前在循环内.df 中的数据框的名称?

假设我有这个包含三个数据框的列表,

a <- list(A = data.frame(a=runif(2), b=runif(2)), 
          B = data.frame(a=runif(2), b=runif(2)), 
          C = data.frame(a=runif(2), b=runif(2)))
a

$A
          a         b
1 0.2833226 0.6242624
2 0.1741420 0.1707722

$B
           a         b
1 0.55073381 0.6082305
2 0.08678421 0.5192457

$C
           a         b
1 0.02788030 0.1392156
2 0.02171247 0.7189846

现在,我想使用这个循环,

for ( .df in a) {
 print(['command I do not know about'])
                }

然后让[我不知道的命令]打印出A、B、C(即.df中数据框的名称)。

我可以这样做吗?

2012-04-28 20:11:58 PDT 更新

这是我使用上面的简单循环从我的输出中得到的一个片段,

for ( .df in a) {
 print(['command I do not know about'](a))
                }

[1] "A"
[1] "B"
[1] "C"

我可以使用,

for (x in names(a)) {
    print(x)
    }

但由于我正在做的事情的性质,我想在我的 for 循环中使用 for ( .df in [list]) { 命令。

【问题讨论】:

  • 使用for (nm in names(a)) { print(nm); .df = a[[nm]] } ?
  • @MartinMorgan,感谢您回答我的问题,但是当数据帧存储在 .df 中时,我正在寻找一种方法来减去 循环内 中的名称元素。很抱歉在我最初的问题中没有更具体。
  • 减去名称是什么意思?您可以添加预期输出的 sn-p 吗?
  • @Chase,谢谢你没有放弃我的问题。我在输出中添加了一个小更新,其中包含我想要的 sn-p。如果这有帮助,请告诉我。
  • 基本上,答案是……名字不见了。循环变量在传递到循环时是一个未命名的数据帧。正如他们在新英格兰所说的那样,当桥梁被冲毁时......“寻找替代路线”。

标签: r list loops for-loop dataframe


【解决方案1】:

要同时提取名称和值,您不能遍历这些值。您可以遍历索引或名称:

# Loop over indices (faster, more cumbersome)
ns <- names(a)
for(i in seq_along(a)) {
   v <- a[[i]]     # extract value
   n <- ns[[i]]    # extract name
   cat(n, ": \n")
   str(v)
}

# Loop over names (easy but slower)
for(n in names(a)) {
   v <- a[[n]]     # extract value
   cat(n, ": \n")
   str(v)
}

...对于长向量,循环名称和提取值可能非常慢(它具有 n^2 时间复杂度)。

【讨论】:

    【解决方案2】:

    不是 for 循环,而是 lapply,但与 for 循环类似。也许这会有所帮助,虽然我很困惑,因为我认为 mrdwab 的答案就是这样。

    FUN <-function(i){
        x <- a[[i]]
        data.frame(name=rep(names(a)[[i]], nrow(x)), x)
    }
    
    LIST <- lapply(seq_along(a), FUN)
    
    do.call("rbind", LIST)
    

    产量:

      name          a         b
    1    A 0.90139624 0.9739355
    2    A 0.34311009 0.6621689
    3    B 0.07585535 0.6010289
    4    B 0.37292887 0.7260832
    5    C 0.17814913 0.1433650
    6    C 0.24586101 0.1741114
    

    【讨论】:

    • 你看到我的更新了吗?问题是我想坚持使用for ( .df in [list]) { 循环结构,但“简单地”减去循环内数据框的名称。我的更新是否有助于以任何方式解释我在寻找什么?如果没有,我将进行新的更新,这将是我的全部问题。我不是在寻求合并任何东西的帮助,我正在寻求帮助,在循环期间/循环内获取 .df 中元素疮的名称。
    • 我在这里通过将索引传递给 lapply(或者在你的情况下是循环)来做到这一点
    猜你喜欢
    • 1970-01-01
    • 2018-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多