我有两个非常相似的数据框,ggplot2
看到的不同;虽然内容相同,但数据结构略有不同。一个是data.frame
,另一个是data_frame
。我想了解ggplot2
如何看待它们的区别。在以下示例中,两者都在stat_function
中使用;当data.frame
产生错误时,data_frame
会生成图表。考虑到Hadleyverse中软件包的互操作性,这尤其令人困惑。当我发现我无法从dplyr生成的数据框(dplyr将data.frames转换为data_frames)创建绘图时,我首先遇到了这个问题,而我认为数据框是相同的(它不是,它是一个data.frame)工作正常。
示例1
首先,来自data.frame
。
library(ggplot2)
library(dplyr)
d.f <- data.frame(mean = 0, sd = 1)
d_f <- data_frame(mean = 0, sd = 1)
ggplot(data.frame(x=-3:3), aes(x)) +
stat_function(fun = function (x) dnorm(x, mean = d.f[1,1], sd = d.f[1,2]))
现在来自data_frame
的非工作版本。
ggplot(data.frame(x=-3:3), aes(x)) +
stat_function(fun = function (x) dnorm(x, mean = d_f[1,1], sd = d_f[1,2]))
## Warning message:
## Computation failed in `stat_function()`:
## Non-numeric argument to mathematical function
示例2
此示例生成不同的错误消息,但可能底层问题相同。首先,工作版本为data.frame
。
logistic <- function (x) { 1/(1 + exp(-x)) }
d.f <- data.frame(b0 = -9, b1 = 0.8)
d_f <- data_frame(b0 = -9, b1 = 0.8)
ggplot(data.frame(x=0:20), aes(x)) +
stat_function(fun = function (x) logistic(d.f[1,1] + d.f[1,2] * x))
这是带有data_frame
的非工作版本。
ggplot(data.frame(x=0:20), aes(x)) +
stat_function(fun = function (x) logistic(d_f[1,1] + d_f[1,2] * x))
## Error in eval(expr, envir, enclos) : object 'y' not found
答案 0 :(得分:2)
ggplot
看到了一个预期值的数据框。
这是由应用于data.frame
或tibble
(Hadley的dplyr
首选的数据框)时应用的子集化方括号运算符返回的数据类型之间的差异造成的。设置data.frame
可以默认更改类型,例如返回向量或值。对tibble
进行子集将返回tibble
,除非用户明确请求重新投射,例如使用pull
或双括号[[]]
。错误消息“数学函数的非数字参数”应该是一个线索。
以下代码通过适当地重新构建tibble
来演示这一点。
库(GGPLOT2)
库(dplyr)
d.f <- data.frame(mean = 0, sd = 1)
d_f <- data_frame(mean = 0, sd = 1)
子集tibble
(又名tbl_df
)会返回tbl_df
。
class(d_f[1,1])
## [1] "tbl_df" "tbl" "data.frame"
可以使用双方括号[[]]
或pull
重新制作。
class(d_f[[1,1]])
## [1] "numeric"
class(pull(d_f[1,1]))
## [1] "numeric"
子集data.frame
会返回一个数字向量。
class(d.f[1,1])
## [1] "numeric"
使用参数tibble
可以生成对drop=FALSE
进行子集化的行为,即无重新转换。
class(d.f[1,1, drop=FALSE])
## [1] "data.frame"
最后,显示解决类型问题可以解决绘图问题......
ggplot(data.frame(x=-3:3), aes(x)) +
stat_function(fun = function (x) dnorm(x, mean = pull(d_f[1,1]), sd = pull(d_f[1,2])))
和
ggplot(data.frame(x=-3:3), aes(x)) +
stat_function(fun = function (x) dnorm(x, mean = d_f[[1,1]], sd = d_f[[1,2]]))