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

时间:2017-06-26 17:29:37

标签: r dataframe

我有一个简单的R data.frame对象df。我正在尝试根据coldf列的逻辑索引从此数据框中选择行。

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

但是,在R数据框中df[df$col == 1]df[df[,col] == 1](由summary命令确认)相比给出了错误的结果。我无法从像http://adv-r.had.co.nz/Subsetting.html这样的链接中理解这种差异,似乎两种方式都可以。此外,strdf$col上的df[, col]命令显示相同的输出。

是否有关于何时使用$ vs []运营商的指南?

修改 深入挖掘并使用此question作为参考,似乎以下代码正常工作

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

但是,不清楚如何防范NA以及何时使用which

2 个答案:

答案 0 :(得分: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

[[]]主要用于列表。

编辑df[which(df$col == 1), ]有效,因为which函数会创建一个逻辑向量,用于检查列索引是否等于1(true)或不是(false)。此逻辑向量传递给df[],仅显示真值。

Remove rows with NAs (missing values) in data.frame - 了解有关如何处理缺失值的更多信息。从数据集中排除缺失值始终是一种好习惯。

答案 1 :(得分:0)

你混淆了许多事情。

df[,col]

col应该是列号。例如,

col = 2
x = df[,col]

将选择第二列并将其存储到x。

df$col

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]来自矩阵。由于数据帧具有矩阵和列表的特征,因此它可以同时使用。