小编pra*_*asp的帖子

如何将数据帧列名从字符串转换为适合(qplot,ggplot2)的参数?

我想编写一个采用数据帧的函数,并将该数据帧中的所有列绘制为直方图.

对于我之前知道的列名的数据帧,我可以写

qplot(colname1, data=df, geom='histogram')
qplot(colname2, data=df, geom='histogram')
...
Run Code Online (Sandbox Code Playgroud)

但我想这样做,所以我可以使用列的名称作为字符串"colname1".

换句话说,怎么写

plot_histogram_of_column <- function(df, colname) {
    # qplot(colname, data=df, geom='histogram') won't work
}
Run Code Online (Sandbox Code Playgroud)

string arguments r ggplot2 dataframe

11
推荐指数
1
解决办法
2013
查看次数

如何创建具有附加功能的data.frame子类

我想创建一个几乎是数据框架的类,有一些增强功能(额外的功能,额外的属性),我想知道最好的方法是什么.该类基本上是一个数据框,但有一些额外的属性,例如该数据框的模式(下面命名为"form",自动派生,表示为数据框,用于将数据框转换为正确的类型),还有其他几件事.当用户在其他不识别其特殊类型的函数中使用此对象时,我希望它们处理对象的data.frame部分.做这个的最好方式是什么?

我发现的两种方法都不令人满意; 我列出了他们以及我仍然看到并试图解决的问题; 问题是:做我想做的最好的方法是什么?

方法1,使用"data.frame"作为"基础"插槽 (受此SO帖子的启发)

setClass("formhubData", representation(form="data.frame"), contains="data.frame")
fd <- new('formhubData', data.frame(x=c(1,2)), form=data.frame(name='x', type='select one', label='X'))
Run Code Online (Sandbox Code Playgroud)

这种方法允许我做以下事情:

fd$x                  >> 1 2
names(fd)             >> "x"
Run Code Online (Sandbox Code Playgroud)

[更新:事实证明"分解"是由我的环境造成的,我用不同的参数反复调用setClass('formhubData',...).在新的R会话中,以下所有函数都按预期工作.]

但它很快崩溃了:

nrow(fd)              >> NULL
colnames(fd)          >> NULL
Run Code Online (Sandbox Code Playgroud)

与上面链接的帖子不同,即使简单is.data.frame也不适用于我

is.data.frame         >> FALSE
Run Code Online (Sandbox Code Playgroud)

方法2,使用"数据"插槽(灵感来自SP)

setClass("formhubData", representation(data="data.frame", form="data.frame"))
fd <- new('formhubData', data=data.frame(x=c(1,2)), form=data.frame(name='x', type='select one', label='X'))
Run Code Online (Sandbox Code Playgroud)

我失去了默认定义:

fd$x             >> NULL
names(fd)        >> integer(0)
Run Code Online (Sandbox Code Playgroud)

但是,至少我可以重新定义它们中的大多数(仍然需要了解[,[[等等):

 dim.formhubData <- function(x) dim(x@data)
 names.formhubData <- function(x) names(x@data)
 nrow(fd)        >> 2
 names(fd)       >> "x"
Run Code Online (Sandbox Code Playgroud)

但是,我似乎无法表达这样一个事实:对于任何采用data.frame的方法,我的类应该用作其@data插槽的直通.我觉得这样的事情需要 *.formhubData <- function(x, ...) *(x, …

r s4

9
推荐指数
1
解决办法
842
查看次数

标签 统计

r ×2

arguments ×1

dataframe ×1

ggplot2 ×1

s4 ×1

string ×1