2016-07-07 66 views
0

我正在嘗試從數據框中對R中的列表進行子集劃分。我現在的嘗試是這樣的: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等等等等。我如何讓這些填充原始行而不是在列表底部創建額外的行?

+1

你可以讓你的例子[reproducible?](http://stackoverflow.com/q/5963269/903061) – Gregor

回答

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

這工作,謝謝! – Nick

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

我認爲這個問題是您的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是字母。當你做
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