2014-10-31 125 views
9

我已經廣泛搜索,但沒有在堆棧溢出中找到對此問題的答案。將列添加到R中的空白數據框中

可以說我有一個數據幀。

我定義:

a <- NULL 
a <- as.data.frame(a) 

如果我想將列添加到該數據幀像這樣:

a$col1 <- c(1,2,3) 

我收到以下錯誤:

Error in `$<-.data.frame`(`*tmp*`, "a", value = c(1, 2, 3)) : 
    replacement has 3 rows, data has 0 

爲什麼行尺寸固定但列不是?

如何更改數據幀的行數?

如果我這樣做(輸入數據到一個列表,然後再轉換爲DF),它工作正常:

a <- NULL 
a$col1 <- c(1,2,3) 
a <- as.data.frame(a) 

回答

7

行尺寸是不固定的,但data.frames被存儲爲列表被限制爲具有相同長度的矢量。您不能添加到col1因爲acol1有三個值(行)和a具有零,從而打破了約束。當您嘗試通過添加比data.frame更長的列來擴展數據幀的維度時,R默認情況下不會自動生成值。第二個示例工作的原因是col1是data.frame中的唯一向量,所以data.frame使用三行進行初始化。

如果你想自動具有data.frame擴展,你可以使用下面的功能:

cbind.all <- function (...) 
{ 
    nm <- list(...) 
    nm <- lapply(nm, as.matrix) 
    n <- max(sapply(nm, nrow)) 
    do.call(cbind, lapply(nm, function(x) rbind(x, matrix(, n - 
     nrow(x), ncol(x))))) 
} 

這將填補缺失值與NA。你可以使用它:cbind.all(df, a)

+0

我想這接近我一直在做了。我認爲有一個比這更聰明的解決方案。我意識到我正在使用矢量,而不是將其添加到數據框中。另外,當我使用fixed這個詞時,我可能沒有描述我的意思。行尺寸不能像列尺寸那樣容易地改變。 – Michal 2014-11-01 22:08:11

+0

此外,它是這樣的答案:http://stackoverflow.com/questions/7962267/cbind-a-df-with-an-empty-df-cbind-fill – Michal 2014-11-01 22:32:26

1

你也可以做這樣的事情,我從多個文件中讀取數據,抓住我想要的列,並將其存儲在數據框中。我檢查數據幀是否有任何東西,如果沒有,創建一個新的,而不是獲取有關不匹配的行數的錯誤:

readCounts = data.frame() 

for(f in names(files)){ 
    d = read.table(files[f], header=T, as.is=T) 
    d2 = round(data.frame(d$NumReads)) 
    colnames(d2) = f 
    if(ncol(readCounts) == 0){ 
     readCounts = d2 
     rownames(readCounts) = d$Name 
    } else{ 
     readCounts = cbind(readCounts, d2) 
    } 
}