2014-01-20 3 views
2

У меня есть список векторов и вы хотите присвоить вектор одной позиции (переопределить). Вот пример кода:R - Замена элемента в списке векторов

for (nodeId in names(chains)) { 
    chains[nodeId] <- unlist(chains[nodeId])[-1] 
} 

После присваивания я получаю много предупреждений о том, что списки не имеют одинаковой длины. Я понимаю, что назначение, которое имело место, было не тем, что я хотел.

Есть ли способ просто заменить элемент в chains[nodeId] с объектом unlist(chains[nodeId])[-1]?

Когда я str(chains), str(chains[nodeId]) и str(unlist(chains[nodeId])[-1]) я получаю следующий вывод:

$str(chains) 
List of 15 
$ 4 : chr [1:3] "root" "alcohol< 9.85" "totalSulfurDioxide>=60.5" 
$ 10 : chr [1:4] "root" "alcohol< 9.85" "totalSulfurDioxide< 60.5" "sulphates< 0.575" 
$ 22 : chr [1:5] "root" "alcohol< 9.85" "totalSulfurDioxide< 60.5" "sulphates>=0.575" ... 
(...) lots more 

$str(chains[nodeId]) 
List of 1 
$ 4: chr [1:3] "root" "alcohol< 9.85" "totalSulfurDioxide>=60.5" 

$str(unlist(chains[nodeId])[-1]) 
Named chr [1:2] "alcohol< 9.85" "totalSulfurDioxide>=60.5" 
- attr(*, "names")= chr [1:2] "42" "43" 

Update:str заменен dput; добавлено dput(chains[nodeId])

$ dput(chains) 
structure(list(`4` = "alcohol< 9.85", `10` = "alcohol< 9.85", 
    `22` = "alcohol< 9.85", `92` = "alcohol< 9.85", `93` = "alcohol< 9.85", 
    `47` = "alcohol< 9.85", `24` = "alcohol>=9.85", `50` = "alcohol>=9.85", 
    `102` = "alcohol>=9.85", `103` = "alcohol>=9.85", `26` = "alcohol>=9.85", 
    `27` = "alcohol>=9.85", `28` = "alcohol>=9.85", `29` = "alcohol>=9.85", 
    `15` = c("root", "alcohol>=9.85", "alcohol>=11.55", "sulphates>=0.685" 
    )), .Names = c("4", "10", "22", "92", "93", "47", "24", "50", 
"102", "103", "26", "27", "28", "29", "15")) 

$ dput(chains[nodeId]) 
structure(list(`15` = c("root", "alcohol>=9.85", "alcohol>=11.55", 
"sulphates>=0.685")), .Names = "15") 

$ dput(unlist(chains[nodeId])[-1)) 
structure(c("alcohol>=9.85", "alcohol>=11.55", "sulphates>=0.685" 
), .Names = c("152", "153", "154")) 

$ dput(chains[nodeId]) 
structure(list(`15` = "alcohol>=9.85"), .Names = "15") 

То, что я хочу добиться того, чтобы удалить первый элемент из вектора в цепях [NodeId]

+2

Можете ли вы сделать свою проблему воспроизводимой? Каков результат (введите часть или используйте 'dput'), каков желаемый результат? Какой код вы использовали, это не работает (вы более или менее обеспечивали это)? –

+0

Что именно вы хотите сделать? можете ли вы привести пример того, как будет выглядеть список до и после операции? –

ответ

3

Если chains список и nodeId является строкой, то chains[nodeId] будет список длина один. Вы хотите chains[[nodeId]], в котором содержится содержимое этого списка.

+0

Спасибо! Это были двойные скобки, о которых я не знал. –

2

Это то, что вы хотите?

# make a list of vectors since no data provided 
origlist<-lapply(1:3,function(x)c("a",paste0("b",x),"c")) 
names(origlist)<-c("_1","_2","_3") 

$`_1` 
[1] "a" "b1" "c" 

$`_2` 
[1] "a" "b2" "c" 

$`_3` 
[1] "a" "b3" "c" 

# remove first item from each as per your example 
lapply(origlist, tail, n = -1) 

$`_1` 
[1] "b1" "c" 

$`_2` 
[1] "b2" "c" 

$`_3` 
[1] "b3" "c" 
+0

Спасибо за ваш ответ, мне потребовалось некоторое время, чтобы понять это, но это действительно интересный подход. Я соглашусь на ответ Ричи, потому что это именно то, что я искал. –

Смежные вопросы