gpt4 book ai didi

r - dplyr 根据我选择列的方式给我不同的答案

转载 作者:行者123 更新时间:2023-12-01 13:49:49 25 4
gpt4 key购买 nike

我可能无法理解 dplyr 的一些基础知识,但 R 的行为似乎非常不同,具体取决于您是将列子集作为一列数据帧还是作为传统向量。这是一个例子:

mtcarsdf<-tbl_df(mtcars)

example<-function(x,y) {
df<-tbl_df(data.frame(x,y))
df %>% group_by(x) %>% summarise(total=sum(y))
}
#subsetting to cyl this way gives integer vector
example(mtcars$gear,mtcarsdf$cyl)
# 3 112
# 4 56
# 5 30

#subsetting this way gives a one column data table
example(mtcars$gear,mtcarsdf[,"cyl"])
# 3 198
# 4 198
# 5 198
all(mtcarsdf$cyl==mtcarsdf[,"cyl"])
# TRUE

由于我的输入在技术上是相等的,所以我得到不同的输出这一事实告诉我我误解了两个对象的行为方式。有人可以告诉我如何改进示例函数,以便它可以更稳健地处理不同的对象吗?

谢谢

最佳答案

首先,您与 == 进行比较的项目并不完全相同。这可以使用 all.equal 而不是 == 来识别:

all.equal(mtcarsdf$cyl, mtcarsdf[, "cyl"])
## [1] "Modes: numeric, list"
## [2] "Lengths: 32, 1"
## [3] "names for current but not for target"
## [4] "Attributes: < target is NULL, current is list >"
## [5] "target is numeric, current is tbl_df"

考虑到这一点,您应该能够通过使用 [[ 而不是 [ 来提取列来获得您想要的行为。

mtcarsdf <- tbl_df(mtcars)

example<-function(x,y) {
df<-tbl_df(data.frame(x,y))
df %>% group_by(x) %>% summarise(total=sum(y))
}

example(mtcars$gear, mtcarsdf[["cyl"]])

但是,更安全的方法可能是将列的重命名集成为您的功能的一部分,如下所示:

example2 <- function(x, y) {
df <- tbl_df(setNames(data.frame(x, y), c("x", "y")))
df %>% group_by(x) %>% summarise(total = sum(y))
}

那么,以下任何一项都应该给您相同的结果。

example2(mtcars$gear, mtcarsdf$cyl)
example2(mtcars$gear, mtcarsdf[["cyl"]])
example2(mtcars$gear, mtcarsdf[, "cyl"])

关于r - dplyr 根据我选择列的方式给我不同的答案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32804916/

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