我目前正在尝试从数据框中对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等。等。如何填写原始行而不是在列表底部创建额外的行?
答案 0 :(得分:1)
以下是正在发生的事情。假设您的buckets$group
为c("a","a","b","b")
。
list.level <- unique(buckets$group)
现在list.level
是c("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])
}