2016-12-05 31 views
2

分配數據,我在一個特定類型的數據子集和分配的R.子集和分別在R

假設我有一個兩列數據框,其中第一列是一個月的名稱,會發生什麼情況不明朗第二列是一些數據。我只是在這裏做一個簡單的例子,但我工作的數據框中的實際行數要大得多。

x <- data.frame(c("october", "march", "february", "january"), rnorm(4), 
stringsAsFactors = FALSE) 
names(x) <- c("months", "value") 

它是安全的子集,並設置以下方式?:

x[x[,1] == "october",1] <- "01/10" 

值數據我問這個,因爲我不完全理解在沒有匹配的存在的情況下會發生什麼第一列,例如:

x[x[,1] == "december",1] <- "01/12" 

X [X [1] == 「十二月」,1]返回:

> x[x[,1] == "december",1] 
[1] months value 
<0 rows> (or 0-length row.names) 

爲什麼R接受一個不存在的東西的賦值?我不清楚在這種情況下會發生什麼,我擔心會發生一些不可預見的任務或行爲。任何人都可以對此有所瞭解嗎?

+0

x [,1]返回一個數據幀。也可以使用drop = TRUE參數使其成爲一個向量 –

+0

,您可能還想指定要將「01/10」插入右側的列?否則它會被複制到列 –

+0

我剛剛糾正了@ joel.wilson – Rafolks

回答

2

爲什麼[R接受工作任務的東西,不存在?

我不知道你想什麼其他的行爲來看看。如果你想獲得擡頭時沒有行被修改,一個方法是用data.table:

library(data.table) 
setDT(x) 

x[ months == "december", months := "01/12", verbose = TRUE ] 

這給...

Creating new index 'months' 
Starting bmerge ...done in 0.02 secs 
Detected that j uses these columns: months 
No rows match i. No new columns to add so not evaluating RHS of := 
Assigning to 0 row subset of 4 rows 

注意,最後兩行告訴你沒有行被修改。

如果你以某種方式寫這個控制檯輸出到一個文本文件中的日誌,那麼你就可以進行掃描,以找出是否有匹配「指定爲0,行子集」的任何實例。也可以通過「審計」程序包(如Jan Gorecki's dtq)修改行中的統計信息。


這個語法是如何工作的:

the data.table package的語法是DT[where, select|update|do, by]。在這種情況下,我們正在進行「更新」並跳過by參數。如果您選擇使用軟件包,我建議使用「入門」頁面。

+0

它是有道理的,如果右邊沒有評估表達式:'x [x [,1] ==「Decembermber」,1] < - 「01/12' 因爲沒有元素在12月份的數據框的第一列中。 – Rafolks

+0

我只是想了解發生了什麼的內在原因,發生了什麼「引擎蓋下」 – Rafolks

+0

@Rafolks讓我知道,如果特別是不清楚。如果你想更好地理解data.table,按順序瀏覽這些小插曲是一個很好的開始:https://github.com/Rdatatable/data.table/wiki/Getting-started – Frank