我有一个简单的R data.frame
对象df
。我正在尝试根据col
中df
列的逻辑索引从此数据框中选择行。
我来自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这样的链接中理解这种差异,似乎两种方式都可以。此外,str
和df$col
上的df[, col]
命令显示相同的输出。
是否有关于何时使用$
vs []
运营商的指南?
修改 深入挖掘并使用此question作为参考,似乎以下代码正常工作
df[which(df$col == 1), ]
但是,不清楚如何防范NA
以及何时使用which
答案 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]
来自矩阵。由于数据帧具有矩阵和列表的特征,因此它可以同时使用。