【问题标题】:R doubling list length when subsetting子集时R加倍列表长度
【发布时间】:2016-11-10 06:04:55
【问题描述】:

我目前正在尝试从数据框中子集 R 中的列表。我目前的尝试如下:

list.level <- unique(buckets$group)
bucket.group <- vector("list",length(list.level))

for(i in list.level){
  bucket.group[[i]] <- subset(buckets$group,buckets$group == i)
}

但是,它似乎创建了一个相同数量行的重复列表,而不是填充列表,返回:

[[1]]
NULL

[[2]]
NULL

...

NULL

[[22]]
NULL

[[23]]
NULL

$A
[1] "A"

$C
[1] "C" "C" "C"

$D
[1] "D" "D" "D"

...

$AJ
[1] "AJ" "AJ" "AJ" "AJ" "AJ"

$AK
[1] "AK" "AK"

A 应该填入 1,C 填入 2,等等。如何让这些填入原始行而不是在列表底部创建额外的行?

【问题讨论】:

标签: r list dataframe subset


【解决方案1】:

我认为问题在于您的 for 声明。

你的代码是这样的:

list.level<-letters[1:10]
> for(i in list.level) print(i)
[1] "a"
[1] "b"
[1] "c"
[1] "d"
[1] "e"
[1] "f"
[1] "g"
[1] "h"
[1] "i"
[1] "j"

它将list.level 中的每个元素分配给i,所以i 是一个字母。当你这样做时
bucket.group[[i]] &lt;- subset(buckets$group,buckets$group == i) 在第一次迭代中,i 是一个字母。所以它会寻找一个名为bucket.group[["a"]] 的列表元素,但没有找到它,所以它创建它并将数据存储在那里。如果改为使用seq_along

for(i in seq_along(list.level)) print(i)
[1] 1
[1] 2
[1] 3
[1] 4
[1] 5
[1] 6
[1] 7
[1] 8
[1] 9
[1] 10

现在i 将始终是一个数字,代码将执行您想要的操作。

所以请改用seq_along

【讨论】:

    【解决方案2】:

    这应该可行:

    list.level <- unique(buckets$group)
    bucket.group <- vector("list",length(list.level))
    
    for(i in 1:length(list.level)){
      bucket.group[[i]] <- subset(buckets$group,buckets$group == list.level[i])
    }
    

    【讨论】:

      【解决方案3】:

      这就是正在发生的事情。假设您的buckets$groupc("a","a","b","b")

      list.level <- unique(buckets$group)
      

      现在list.levelc("a","b")

      bucket.group <- vector("list",length(list.level))
      

      由于 length(list.level) 是 2,现在您的 bucket.group 是 2 个 NULL 元素的列表,它们的名称是 1 和 2。

      for(i in list.level){
      

      调用list.level的值,与for i in c("a","b")相同。

           bucket.group[[i]] <- subset(buckets$group,buckets$group == i)
      

      由于i 循环覆盖"a""b",您现在填写bucket.group[["a"]]bucket.group[["b"]],而bucket.group[[1]]bucket.group[[2]] 保持不变。

      要解决这个问题,你应该改写

      list.level <- unique(buckets$group) # ok, this was correct
      bucket.group <- list() # just empty list   
      for(i in 1:length(list.level)){
        bucket.group[[i]] <- buckets$group[buckets$group == list.level[[i]] ]
      }
      

      【讨论】:

        猜你喜欢
        • 2013-10-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-08-15
        • 2014-09-21
        • 2021-10-18
        • 1970-01-01
        • 2012-01-17
        相关资源
        最近更新 更多