2015-04-12 117 views
-1

我寫一個函數取布爾參數動態更新的名字:選擇數據框中列和R中

Discretize <- function(Data, Price, Hour) # Bool input 
{ 
    num_var <- sum(Price, Hour) 
    Data_Qual <- as.data.frame(array(0, dim = c(nrow(Data), num_var))) 
    names(Data_Qual) <- c(ifelse(Price, "Price.Qual", numeric(0)), 
         ifelse(Hour, "Hour.Qual", numeric(0))) 
} 

但是當我運行函數:Discretize(Data = Date, Price = T, Hour = F),我得到了以下錯誤:

Error in names(Data_Qual) <- c(ifelse(Price, "Price.Qual", numeric(0)), : 'names' attribute [2] must be the same length as the vector [1]

任何人都可以幫助我解決這個問題,謝謝!

+0

有一些信息丟失。什麼是「Data_New」和「Date」?另外,你的電話應該包含'Data = Date',但這可能是一個錯字。另外,你想用'names'改變什麼?如果你使用'colnames'或'rownames',理解起來會更容易,但是從你的錯誤來看,列數不是2,就像你定義的名字的數量一樣。 – Molx

+0

對於輸入錯誤,Data_New應該是Data,輸入參數。我在這裏要做的是給data.frame命名:Data_Qual基於輸入變量,它採用bool值。所以當我打電話給Discretize(Date = Date,Price = T,Hour = F)時,我期待data.frame只有一個Colum,Price,但是我得到了上述錯誤。 – user4780831

回答

0

你可以讓你的函數小複雜,工作,像這樣:

Discretize <- function(Data, Price, Hour) { 
    df <- Data[,c(Price, Hour)] 
    names(df) <- c("Price.Qual", "Hour.Qual")[c(Price, Hour)] 
    df 
} 

sampleData <- data.frame(P=1, H=2) 
Discretize(Data=sampleData,Price=TRUE,Hour=FALSE) 

#Price.Qual 
#  1 
+0

感謝您的回答,這真的有幫助!只是爲了好奇,我真的很想知道我的代碼 – user4780831

+0

有什麼問題除了一些不必要的步驟外,關鍵的錯誤是在名稱調用中使用'ifelse'。當計算結果爲false時,'numeric(0)'仍然會在向量中找到一個空格,所以您的數據框總是有兩個名稱,但不能給一列數據框分配兩個名稱。要做到這一點,你必須使用'NA'而不是'numeric(0)',然後'names < - names [!is.na(names)]'來移除給定'NA價值。 – Molx

+0

太棒了!非常感謝! – user4780831