我最近發現,在對一個對象(即一個數據框)進行子集化處理後,結果對象可能是在同一行代碼中的「[」它更早!)。這裏是一個例子:嵌套子集與「[」
# Create a data frame
df1 <- as.data.frame(matrix(1:9, nrow = 3))
# Take a look at the data frame
df1
V1 V2 V3
1 1 4 7
2 2 5 8
3 3 6 9
# If I want the value which is on the 3rd row and 2nd column
df1[3,2]
[1] 6
# But I could also
df1[,2][3]
[1] 6
關於第二個選擇的幾句話。 df[,2]
返回一個原子向量,然後將其與df[,2][3]
進行子集合。
以下數據框將有助於說明我的問題。這是一個簡單的數據框,其中包含26名學生的名字,他們各自的部門以及一個數字值。爲了可重現性添加種子編號。
set.seed(123)
df2 <- data.frame(name = letters, dept = sample(c("econ", "stat", "math"), 26, replace = TRUE), value = runif(26, 0, 100))
head(df2)
name dept value
1 a econ 54.40660
2 b math 59.41420
3 c stat 28.91597
4 d math 14.71136
5 e math 96.30242
6 f econ 90.22990
我想知道誰在econ
部門的最低值。我想的第一件事是:
df2[df2$dept == "econ" & df2$value == min(df2$value),]
[1] name dept value
<0 rows> (or 0-length row.names)
我花了一段時間來理解我在做什麼錯的,但我終於明白了,問題是,我的代碼假設誰總體具有最低值的人也來自econ
部門,情況並非如此(這就是R
給我的答案)。實際上,總體價值最低的人來自stat
部門。
i <- which(df$value == min(df$value))
df[i,]
name dept value
9 i stat 2.461368
當然,我可以很容易找到答案,我的問題:
df_econ <- df2[df2$dept == "econ",]
df_econ
name dept value
1 a econ 54.40660
6 f econ 90.22990
15 o econ 14.28000
17 q econ 41.37243
18 r econ 36.88455
19 s econ 15.24447
df_econ[df_econ$value == min(df_econ$value),]
name dept value
15 o econ 14.28
但我想知道如果我可以使用與[
運營商獲得相同的結果「嵌套」子集。我的意思是這樣的代碼:
df2[df2$dept == "econ",][... ,]
我不知道如何來引用value
列在這一點上,因爲第一子集操作df2[df2$dept == "econ",]
所得到的數據幀從df2
不同的數據幀。我也知道value
列是第3列,但我不知道如何使用列索引而不是他們的名稱設置子集條件。
謝謝你的幫助。
FWIW'data.table's非常適合這種類型的操作。 – nrussell
你需要鏈接這個,這意味着包data.table或包dplyr。 – Roland
@nrussell感謝您的建議。我更熟悉'dplyr'軟件包,但在基本R中沒有辦法做到這一點? – SavedByJESUS