2017-06-26 31 views
0

我有一個簡單的R data.frame對象df。我試圖根據df中列col的邏輯索引從此數據框中選擇行。

我來自蟒蛇世界,在類似的操作中,我可以選擇使用df[df[col] == 1]df[df.col == 1]來選擇最終結果。

然而,在R數據幀相比df[df[,col] == 1](由summary命令確認)df[df$col == 1]給出一個不正確的結果。我無法理解這種差異,因爲像http://adv-r.had.co.nz/Subsetting.html這樣的鏈接似乎無論哪種方式都可以。另外,df$coldf[, col]上的str命令顯示相同的輸出。

是否有關於何時使用的指導$ vs []運營商?

編輯: 挖得更深一些,並使用該question作爲參考,它看起來像下面的代碼工作正常

df[which(df$col == 1), ]

然而,尚不清楚如何防範NA以及何時使用which

+0

根據你的例子,我有點想知道你是否對'[''和'[['列表(包括數據框)'之間的區別有點困惑?因爲使用單個和雙個大括號具有不同的結果。 (請參見右邊鏈接的最高級相關問題。) – joran

+0

感謝編輯問題 – goofd

+0

如果您對使用data.table包感興趣,可以非常容易地基於邏輯條件對行進行子集劃分。請參閱https://cran.r-project.org/web/packages/data.table/vignettes/datatable-intro.html –

回答

0

使用$當您想選擇一個特定列由名字df$col_name

當你想用數字來選擇 一個或多個

使用[]

  • df[,1] # select column with index 1
  • df[,1:3]# select columns with indexes 1 to 3
  • df[,c(1,3:5,7)] # select columns with indexes 1, 3 to 5 and 7

[[]]主要用於列表。

EDITdf[which(df$col == 1), ]作品因爲which函數創建,檢查,如果該列指數等於1(真)或否(false)的邏輯載體。這個邏輯向量被傳遞給df[],只顯示真值。

Remove rows with NAs (missing values) in data.frame - 瞭解更多關於如何處理缺失值的信息。從數據集中排除缺失值總是一個好習慣。

+0

感謝您的澄清。 @joran在評論中指出了類似的東西。編輯了這個問題 - 對於混淆感到抱歉 – goofd

+0

@goofd在這裏使用'which'將把所有由布爾值比較產生的'NA'視爲FALSE。否則,你會被一個帶有(可能)NA值的布爾向量索引,這會產生「NA行」。你可能會發現在R社區有關於這種行爲的爭論。 – joran

+0

這真的很有趣...這些每種語言都帶有「NA」的怪癖總是讓我 – goofd

0

你困惑了很多事情。

df[,col] 

COL應的列數。例如,

col = 2 
x = df[,col] 

將選擇第二列並將其存儲到x。

df$col 

山坳應該是列名。例如,

df=data.frame(aa=1:5,bb=10:14) 
x = df$bb 

將選擇第二列並將其存儲到x。但是你不能寫df$2

最後,

df[[col]] 

相同df[,col]如果COL是一個數字。如果col是一個字符(R中的「字符」表示與其他語言中的字符串相同),那麼它選擇具有該名稱的列。示例:

df=data.frame(aa=1:5,bb=10:14) 
foo = "bb" 
x = df[[foo]] 
y = df[[2]] 
z = df[["bb"]] 

現在x,y和z都包含df第二列的副本。

符號foo[[bar]]來自列表。符號foo[,bar]來自矩陣。由於數據幀具有矩陣和列表的特徵,因此它可以同時使用兩者。

相關問題