子集时R加倍列表长度

时间:2016-07-07 19:17:20

标签: r list dataframe subset

我目前正在尝试从数据框中对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等。等。如何填写原始行而不是在列表底部创建额外的行?

3 个答案:

答案 0 :(得分:1)

以下是正在发生的事情。假设您的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]] ]
}

答案 1 :(得分: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]] <- 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 :(得分:0)

这应该有效:

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])
}