是否有更好的语法来对 R 中的数据框进行子集化?

Posted

技术标签:

【中文标题】是否有更好的语法来对 R 中的数据框进行子集化?【英文标题】:Is there a better syntax for subsetting a data frame in R? 【发布时间】:2012-10-22 04:49:07 【问题描述】:

我想有条件地对一个数据帧进行子集化而不引用该数据帧。例如,如果我有以下内容:

long_data_frame_name <- data.frame(x=1:10, y=1:10)

我想说:

subset <- long_data_frame_name[x < 5,]

但是,我不得不说:

subset <- long_data_frame_name[long_data_frame_name$x < 5,]

plyr 和 ggplot 处理得非常好。是否有任何软件包可以使数据框的子集化同样漂亮?

【问题讨论】:

美在旁观者的眼中。 :-) 你可能会觉得with 更可爱。 @Carl 我看不出with 在这种情况下如何应用。尽管如此,我认为如果不使用withwithin,很难编写漂亮的R 代码。 @Roman 怎么样?您仍然需要输入两次 data.frame 的名称。 我同意@mplourde:使用with,你仍然需要subset &lt;- with(long_data_frame,long_data_frame_name[x &lt; 5,]),这不会节省太多(只有当你有一堆条件要设置子集时它才会有用)- - 除非我错过了什么? @BenBolker 是的,你是对的。我正在尝试 :-( 来扩展我对“有吸引力”代码的主观性的尖刻评论。我自己会选择subset 【参考方案1】:

尝试 dplyr,在发布并回答此问题后发布。它非常适合许多常见的数据帧处理任务。

library(dplyr)
subset <- filter(long_data_frame_name, x > 5)

或者,等效地:

subset <- long_data_frame_name %>% filter(x > 5)

【讨论】:

【参考方案2】:

是的:

newdata <- subset(mydata, sex=="m" & age > 25)

newdata <- subset(mydata, sex=="m" & age > 25 , select=weight:income)

参考: http://www.statmethods.net/management/subset.html

【讨论】:

'subset 【参考方案3】:

美是主观的,不是吗?为了分享其他解决方案,还有sqldf 包:

library(sqldf)
subset <- sqldf("select * from long_data_frame_name where x < 5")

【讨论】:

【参考方案4】:

听起来您正在寻找 data.table 包,它实现了与您描述的一样的索引语法。 (data.table 对象本质上是具有附加功能的 data.frames,因此您几乎可以在任何使用“普通旧”data.frame 的地方继续使用它们。)

该软件包的作者 Matthew Dowle 在他对 this popular SO [r]-tag question 的回答中论证了 [.data.table() 的索引语法的优势。他在那里的回答也可以直接回答你上面的问题!

这是一个例子:

library(data.table)
long_data_table_name <- data.table(x=1:10, y=1:10) 

subset <- long_data_table_name[x < 5, ]
subset
#    x y
# 1: 1 1
# 2: 2 2
# 3: 3 3
# 4: 4 4

【讨论】:

@Ben 请注意,data.tables 和 data.frames 不能完全互换。此外,我不确定我是否认为加载一个额外的库只是为了基础语言有效支持的语法约定。 @mplourde 好警告。我认为子集似乎是一个更安全的选择。但是干净的语法对我来说很重要。这是我更喜欢python的原因。它更易于阅读,因此更易于理解。 @mplourde -- 感谢您添加此警告,我完全同意。如果 Ben 没有特别要求“一个使 data.frame 子集同样漂亮的包”,我可能会进行更多的对冲。 @BenHaley -- 还要注意subset() 有其自身的缺点。特别是,不要尝试以编程方式使用它(即在您编写的任何函数中);它基本上是用于交互使用的,?subset 中甚至还有一个警告。 @mplourde -- Here's a link 有很多讨论(以及指向其他示例的链接),可以帮助您了解问题。 (FWIW,直到我第一次阅读警告后的 ,我才终于“明白”subset() 的问题所在。)

以上是关于是否有更好的语法来对 R 中的数据框进行子集化?的主要内容,如果未能解决你的问题,请参考以下文章

R:根据一天中的时间有效地对数据框进行子集化

如何在不使用左连接的情况下根据“OR”条件对数据框进行子集化? [复制]

如何使用“OR”组合多个条件以对数据框进行子集化?

子集 R 数据框导致神秘的 NA 行

R中数据框中的嵌套子集

如何对您的数据框进行子集化以在 R 中保留前 3 个重复行?