2017-01-24 31 views
1

從Data.frame中刪除列時,我遇到了一個奇怪的行爲。起初,我有:奇怪行爲從R中的data.frame中刪除列

> a <- data.frame("a" = c(1,2,3), "abc" = c(3,2,1)); print(a) 
    a abc 
1 1 3 
2 2 2 
3 3 1 

現在,我從data.frame

> a$a <- NULL; print(a) 
    abc 
1 3 
2 2 
3 1 

正如預期的那樣刪除a$a,我只有abc我data.frame列。但奇怪的部分開始,當我嘗試引用刪除列a

> print(a$a) 
[1] 3 2 1 
> print(is.null(a$a)) 
[1] FALSE 

它看起來如R返回a$abc代替NULL的價值。

發生這種情況時,剩餘列的名稱的開頭與刪除列的名稱完全匹配。

這是一個錯誤還是我錯過了這裏的東西?

+0

你是rigth @Chase,雖然問題的標題不是最好的搜索。 –

+0

@lselzer - 我當然同意。自從我回答以來,我只知道它存在。 JD修正了這個問題,我會去相應地更新其他問題。或者他們應該被合併...或者其他東西。 – Chase

+1

這只是R試圖聰明,猜測你的意思。它指出「a $ a」意味着「$ abc」,因爲這是唯一可能的選擇。這對'a < - data.frame(「a」= c(1,2,3),「b」= c(3,2,1))不起作用。一個$ a < - NULL; is.null(A $ A)'。在這種情況下,這只是偶然的,因爲兩列都以'a'開頭。 –

回答

0

雖然你確切的問題已經在評論回答,另一種避免這種行爲是轉換你的data.frametibble,這是一個data.frame的剝離擊落版本,沒有列名改寫(munging),其中other things

library(tibble) 
df_t <- as_data_frame(a) 
df_t 
# A tibble: 3 × 1 
    abc 
    <dbl> 
1  3 
2  2 
3  1 
> df_t$a 
NULL 
Warning message: 
Unknown column 'a' 
+0

這是我正在尋找的一種東西。不幸的是,速度較慢。根據我的測量(不是廣泛的),慢3倍。 – Sergey

8

從幫助。 ?$

name:文字字符串或 名稱(可能是反引號)。對於 提取,這通常是(部分 與對象的名稱匹配)(請參閱'環境'下的 )。

所以這是正常行爲,因爲名稱部分匹配。有關部分匹配的更多信息,請參閱?pmatch。

乾杯

4

也許值得指出的(因爲它沒有拿出上一related question),這部分匹配的行爲是一個潛在的原因,以避免使用R'當用「$」,除了作爲一種方便的速記交互式地(至少,這是一個小心使用它的理由)。

選擇通過dat[,'ind']一欄,如果你知道列的名稱,而不是位置,或者通過dat[,3]如果你知道位置,往往是更安全的,因爲你不會觸犯部分匹配的運行。

0

從R語言定義[3.4.1節pg.16-17] -

https://cran.r-project.org/doc/manuals/r-release/R-lang.pdf

字符:x的IN I中的字符串對名稱匹配屬性和使用結果整數。對於[[和如果完全匹配失敗時使用$部分匹配,所以如果x不包含名爲「aa」的組件,x $ aa將匹配x $ aabb,而「aabb」是唯一具有前綴「aa」的名稱。對於[[,可以通過精確的參數控制部分匹配,默認爲NA,表示允許部分匹配,但在發生時會產生 警告。將精確設置爲TRUE可以防止發生部分匹配,使用FALSE值可以實現,並且不會發出任何警告。請注意,[總是需要精確匹配。字符串「」被特別處理:它表示'沒有名字'並且不匹配任何元素(即使沒有名字也不匹配)。請注意,部分匹配僅在提取 時使用,而不是在更換時使用。