2013-07-24 103 views
25

有沒有一種方法可以在兩個向量上使用mapply來構造一個命名列表?第一個向量的類型爲character,包含用於列表的名稱,而第二個包含值。從兩個向量(名稱,值)創建一個命名列表

到目前爲止,我唯一的解決辦法是:

> dummyList = list() 
> addToList <- function(name, value) { 
+ dummyList[[name]] <- value 
+ } 
> mapply(addToList, c("foo", "bar"), as.list(c(1, 2)) 
$foo 
`1` 

$bar 
`2` 

這似乎是一個虛構的解決方案,但我想不出如何做到這一點並非如此。我與它的問題是:

  1. 它需要的dummyList創建即使dummyList從未改變,是調用mapply後空單。

  2. 如果數字向量c(1, 2)未被轉換爲列表,則調用mapply的結果是雙命名的向量。

要解決問題2,我永遠可以調用mapply兩個向量,然後調用的結果as.list,但是看起來應該有辦法直接創造與價值的是一個清單向量。

回答

46

您可以使用setNames()

setNames(as.list(c(1,2)), c("foo", "bar")) 

(用於列表)或

setNames(c(1,2), c("foo", "bar")) 

(一個向量)

+2

謝謝。我不知道'setNames'函數,並且完美適合我的目標。出於好奇,有沒有辦法用你知道的「lapply」來做到這一點? 「lapply」可以返回列表似乎是可能的。 –

+0

你是什麼意思「使用'lapply'」?你想用'lapply'執行相同的任務嗎? (如果是這樣,爲什麼?作爲一個編程練習?更多的上下文將是有用的。)如果你想做其他事情,編輯你的問題或問一個新的? –

8

我分享本的你爲什麼會想這樣做困惑,和他的建議。

只是爲了好奇,有在mapply一種「隱藏」功能,可讓此:

x <- letters[1:2] 
y <- 1:2 
mapply(function(x,y) { y }, x, y, SIMPLIFY = FALSE,USE.NAMES = TRUE) 
$a 
[1] 1 

$b 
[1] 2 

注意到,對於USE.NAMES該文件說:

USE.NAMES邏輯;如果第一個參數具有名稱,則使用名稱;如果它是一個字符向量,則使用該名稱,將該字符向量用作名稱。

+1

我不認爲這是一個令人費解的用例,只是一個退化的用例。我需要組合兩個雙數組,每個數組都有一些不會被USE.NAMES自動拾取的row.names列,所以我必須手動傳入row.names(x)作爲函數的參數, 't get used:'f = function(n,x,y){if(y> 0){-1 * x} else {x}}; r = mapply(f,row.names(x),x,y,SIMPLIFY = F,USE.NAMES = T)'。 'data.frame(unlist(r))'完成了這項工作。感謝您指出此功能! –

相關問題