R使用逻辑索引从数据帧中选择行:通过`$`vs`[]访问列`

R使用逻辑索引从数据帧中选择行:通过`$`vs`[]访问列`,r,dataframe,R,Dataframe,我有一个简单的R data.frame对象df。我试图根据df中列col的逻辑索引从这个数据帧中选择行 我来自python世界,在类似的操作中,我可以选择使用df[df[col]==1]或df[df.col==1]进行选择,并获得相同的最终结果 然而,在R数据帧中,与summary命令确认的df[df[,col]==1]相比,df[df$col==1]给出的结果不正确。我无法从链接中理解这种差异,似乎任何一种方式都可以。另外,df$col和df[,col]上的str命令显示相同的输出 关于何时使

我有一个简单的R data.frame对象df。我试图根据df中列col的逻辑索引从这个数据帧中选择行

我来自python世界,在类似的操作中,我可以选择使用df[df[col]==1]或df[df.col==1]进行选择,并获得相同的最终结果

然而,在R数据帧中,与summary命令确认的df[df[,col]==1]相比,df[df$col==1]给出的结果不正确。我无法从链接中理解这种差异,似乎任何一种方式都可以。另外,df$col和df[,col]上的str命令显示相同的输出

关于何时使用$vs[]运算符,是否有任何指导原则

编辑: 再深入一点并将其作为参考,下面的代码似乎工作正常

df[whichdf$col==1,]

但是,当您想按名称df$col\u name选择一个特定列时,不清楚如何防范NA以及何时使用哪个

使用$

如果要按编号选择一列或多列,请使用[]:

df[,1]选择索引为1的列 df[,1:3]选择索引为1到3的列 df[,c1,3:5,7]选择索引为1、3到5和7的列。 [[]主要用于列表

EDIT:df[whichdf$col==1,]之所以有效,是因为哪个函数创建了一个逻辑向量,用于检查列索引是否等于1 true或false。该逻辑向量被传递给df[],并且只显示真值


-了解有关如何处理缺失值的更多信息。从数据集中排除缺少的值始终是一个很好的做法。

您混淆了许多事情

col应该是列号。比如说,

col = 2
x = df[,col]
df=data.frame(aa=1:5,bb=10:14)
x = df$bb
将选择第二列并将其存储到x

col应该是列名。比如说,

col = 2
x = df[,col]
df=data.frame(aa=1:5,bb=10:14)
x = df$bb
将选择第二列并将其存储到x。但是你不能写df$2

最后,

df[[col]]
如果col是一个数字,则与df[,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]来自矩阵。由于dataframe具有矩阵和列表两种功能,因此它可以同时使用这两种功能。

根据您的示例,我想知道您是否对[和]之间的区别有点困惑[[对于包含数据框的列表?因为使用单括号和双括号会产生不同的结果。请参阅右侧链接的顶部相关问题。感谢您编辑了该问题。如果您对使用data.table软件包感兴趣,您可以非常轻松地根据逻辑条件对行进行子集。请参阅以获得澄清。@joran pointed在评论中删除了类似的内容。编辑了问题-抱歉confusion@goofd这里的用法是将布尔比较产生的任何NAs视为FALSE。否则,您将通过一个布尔向量进行索引,其中可能包含NA值,这将生成NA行。您可能会发现在关于这种行为的R社区。这真的很有趣……每种语言中的NA的这些怪癖总是让我着迷