gpt4 book ai didi

r - data.frames 的非标准子集

转载 作者:行者123 更新时间:2023-12-04 09:12:22 24 4
gpt4 key购买 nike

对数据框进行子集化的怪癖之一是在提及列时必须重复键入该数据框的名称。例如,这里提到了 3 次数据帧 cars:

cars[cars$speed == 4 & cars$dist < 10, ]
## speed dist
## 1 4 2
data.table 包解决了这个问题。
library(data.table)
dt_cars <- as.data.table(cars)
dt_cars[speed == 4 & dist < 10]
dplyr 也是如此。
library(dplyr)
cars %>% filter(speed == 4, dist < 10)

我想知道标准问题 data.frames 是否存在解决方案(即,不诉诸 data.tabledplyr )。

我想我正在寻找类似的东西
cars[MAGIC(speed == 4 & dist < 10), ]

或者
MAGIC(cars[speed == 4 & dist < 10, ])

其中 MAGIC 将被确定。

我尝试了以下操作,但它给了我一个错误。
library(rlang)
cars[locally(speed == 4 & dist < 10), ]
# Error in locally(speed == 4 & dist < 10) : object 'speed' not found

最佳答案

1) 子集 这只要求cars 被提及一次。不使用任何包。

subset(cars, speed == 4 & dist < 10)
## speed dist
## 1 4 2

2) sqldf 这使用了一个包,但不使用 dplyr 或 data.table,这是问题排除的仅有的两个包:
library(sqldf)

sqldf("select * from cars where speed = 4 and dist < 10")
## speed dist
## 1 4 2

3) 分配 不确定这是否重要,但您可以将 cars 分配给其他一些变量名称,例如 .,然后使用它。在那种情况下 cars 只会被提及一次。这不使用包。
. <- cars
.[.$speed == 4 & .$dist < 10, ]
## speed dist
## 1 4 2

或者
. <- cars
with(., .[speed == 4 & dist < 10, ])
## speed dist
## 1 4 2

关于这两个解决方案,您可能想查看 Bizarro Pipe 上的这篇文章: http://www.win-vector.com/blog/2017/01/using-the-bizarro-pipe-to-debug-magrittr-pipelines-in-r/

4) magrittr 这也可以在 magrittr 中表达,并且该问题并未排除该包。请注意,我们正在使用 magrittr %$% 运算符:
library(magrittr)

cars %$% .[speed == 4 & dist < 10, ]
## speed dist
## 1 4 2

关于r - data.frames 的非标准子集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47231875/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com