2011-08-23 42 views
9

我覺得這個問題很愚蠢,但是在這裏。我有一個數字列表,但我想將它與日期結合起來。把一個重複的值放到列中

例如:

list1 <- c(1, 2, 3, 4, 5) 
list2 <-c("2009-01-01") 
list3 <-cbind(list2, list1) 

我想同日上市的相同的次數有多少數據點,然後用數據點相結合。

date    number 
"2009-01-01"   1 
"2009-01-01"   2 
"2009-01-01"   3 
"2009-01-01"   4 
"2009-01-01"   5 

當我嘗試運行上面的代碼時,我得到有關長度不匹配的消息。任何建議表示讚賞。謝謝。

+1

我不明白;它適用於我....你可能想要嘗試一個data.frame而不是一個矩陣('cbind'產生的)。另外,避免調用不是「list」列表的東西。由於列表是R數據類型,它只是令人困惑。 –

回答

9

編輯使我的數據框評論更具描述性。

如何使用rep

list1 <- 1:5 
list2 <- rep("2009-01-01",length(list1)) 
list3 <- cbind(list2, list1) 

雖然R的回收規則應該給你你想要的輸出無論如何。另外,你確定你不想要一個數據幀:

list3 <- data.frame(date = list2, number = list1) 

因爲cbind會在你的情況下產生字符矩陣,其中,因爲矩陣只能是單一型的。

2

儘管看到你認爲另一個答案是「完美」,但我發佈的原因是cbind返回一個矩陣,因爲你有一個向量是'字符',它完全是類型'字符'。

> str(list3) 
chr [1:5, 1:2] "2009-01-01" "2009-01-01" "2009-01-01" ... 
- attr(*, "dimnames")=List of 2 
    ..$ : NULL 
    ..$ : chr [1:2] "list2" "list1 

當使用混合類型(日期和數字)的數據來使用data.frame時,會更好。它有另外的功能,你甚至不需要使用代表(),因爲參數循環將自動地重複:

> data.frame(dt = as.Date("2009-01-01"), l1 = list1) 
      dt l1 
1 2009-01-01 1 
2 2009-01-01 2 
3 2009-01-01 3 
4 2009-01-01 4 
5 2009-01-01 5 
+0

好點。我有一些r的經驗,我仍然很難記住各種數據類型處理。感謝您的提醒。 – acesnap

1

cbind會返回一個數據幀,如果其中一個參數是一個數據幀。在這種情況下,它只是作爲data.frame的封裝[參見?cbind]。

在用戶說cbind確實工作並且創建了一個矩陣的其他答案和評論中,他們忽略了矩陣是一個字符矩陣,並且這些數字被合併爲字符串。你可能不想要那樣。

一個解決方案,但沒有提出,是爲了做到這一點:

vector1 <- c(1, 2, 3, 4, 5); 
vector2 <- c("2009-01-01"); 
cbind(data.frame(date = vector2), number = vector1); 

這就產生了一個數據幀,因爲第一個參數是一個數據幀。

但是,我認爲最好的,和一個真正表明你知道你想要的是直接調用data.frame

data.frame(date = vector2, number = vector1);