我了解到[ , ]
表示法从数据帧中以[行号,列号]的形式提取值。我也知道$
表示法将一列中的所有值作为向量返回,但是我不确定这两种表示法是如何组合在一起的。
编辑:
其他上下文/示例:mydat[mydat$obsnum == 1,]
答案 0 :(得分:2)
假设mydat
是具有n
行的数据帧。然后mydat$obsnum == 1
创建一个长度为n
的逻辑向量,如果TRUE
的对应元素为1,则每个元素为mydat$obsnum
,否则为FALSE
。
像mydat[1, ]
这样的子集为您提供mydat
的第一行。但是您也可以使用逻辑向量进行子集化。您将获得逻辑向量为TRUE
的所有行。
因此,mydat[mydat$obsnum == 1, ]
为您提供mydat
的所有行,其中mydat$obsnum
等于1。
答案 1 :(得分:2)
:
的含义mydat[mydat$obsnum == 1,]
如果将表达式分解为以下等效的3行,则很简单:
X <- mydat$obsnum
Y <- X == 1
mydat[Y,]
所以,正如您正确指出的那样:
X <- mydat$obsnum
返回一个整数向量(我假设观察次数)
然后:
Y <- X == 1
返回一个长度为c(TRUE,FALSE,TRUE...)
且长度为X
的逻辑矢量,例如TRUE
,其中X
等于1且{{ 1}}。
最后:
FALSE
选择mydat[Y,]
为mydat
的{{1}}行,并排除Y
为TRUE
的行。
实际上,Y
子集运算符FALSE
接受包含行/列索引的整数向量,或者指示必须提取哪些行/列的逻辑向量,甚至接受指示行/列的字符向量。要选择的名称。
答案 2 :(得分:1)
在您的情况下,idx <- mydat$obsnum == 1
生成逻辑向量idx
。现在,如果为idx[1] == TRUE
,则意味着谓词用于生成对第一个元素求值为TRUE
的向量。对于例如idx[3] == FALSE
,只是谓词没有被满足。
然后,您的逻辑向量可用于索引数据帧。因此,您实际上正在做的是:mydat[c(TRUE, TRUE, FALSE, TRUE, FALSE), ]
,只是您从未手工编写过索引向量。
正如您正确观察到的那样,[]
标记也可以用于选择数据框中的列。例如,您可能只想选择第一列:mydat[c(TRUE, TRUE, FALSE, TRUE, FALSE), 1]
。
现在,很棒的是布尔索引也适用于列!您能猜出mydat[c(TRUE, TRUE, FALSE, TRUE, FALSE), c(TRUE, FALSE)]
做什么吗?究竟!它返回第一列,但不返回第二列!也就是说,如果数据帧精确地具有两列,则向量将与匹配length(colnames(df))
一起循环使用。
回到介绍性示例mydat[mydat$obsnum == 1,]
,这将选择谓词所在的所有行以及所有列。如果执行了mydat[mydat$obsnum == 1, mydat$obsnum == 1]
,则所有发生的事情是R生成了两个逻辑向量并将其用于索引数据帧,因此它对该谓词的语义一无所知。
编辑:除index vectors外,您还可以拥有index matrices。您还将发现此功能已进入Pandas(Python数据分析库)中。