我终于决定将在互联网上浮动的sort.data.frame方法放入R包中.它只是被要求太多而无法留给临时分发方法.
但是,它使用参数编写,使其与泛型排序函数不兼容:
sort(x,decreasing,...)
sort.data.frame(form,dat)
Run Code Online (Sandbox Code Playgroud)
如果我sort.data.frame改为将减少作为参数sort.data.frame(form,decreasing,dat)并且丢弃减少,那么它就会失去它的简单性,因为你总是必须指定dat=并且不能真正使用位置参数.如果我将其添加到最后sort.data.frame(form,dat,decreasing),则顺序与泛型函数不匹配.如果我希望减少被赶上点`sort.data.frame(form,dat,...),那么当使用基于位置的匹配时,我相信泛型函数会将第二个位置分配给减少,它会得到丢弃.协调这两个功能的最佳方法是什么?
完整的功能是:
# Sort a data frame
sort.data.frame <- function(form,dat){
# Author: Kevin Wright
# http://tolstoy.newcastle.edu.au/R/help/04/09/4300.html
# Some ideas from Andy Liaw
# http://tolstoy.newcastle.edu.au/R/help/04/07/1076.html
# Use + for ascending, - for decending.
# Sorting is left to right in the formula
# Useage is either of the following:
# sort.data.frame(~Block-Variety,Oats)
# sort.data.frame(Oats,~-Variety+Block)
# If dat is the formula, then switch form and dat
if(inherits(dat,"formula")){
f=dat
dat=form
form=f
} …Run Code Online (Sandbox Code Playgroud) 我有一个看起来像这样的data.frame:
> head(ff.df)
.id pio caremgmt prev price surveyNum
1 1 2 2 1 2 1
2 1 2 1 2 1 2
3 1 1 1 2 2 3
4 1 2 2 1 5 4
5 1 1 1 1 3 5
6 1 1 2 2 4 6
Run Code Online (Sandbox Code Playgroud)
我想通过id重塑所有四个非id变量.换句话说,我想要colnames:
surveyNum pio1 pio2 pio3 caremgmt1 caremgmt2 caremgmt3 prev1 prev2 prev3 price1 price2 price3
Run Code Online (Sandbox Code Playgroud)
我可以为一个变量做到这一点:
> cast( ff.df, surveyNum~.id, value=c("pio"))
surveyNum 1 2 3
1 1 2 2 2 …Run Code Online (Sandbox Code Playgroud) 人们常常说,data.frame继承list,这是有道理的给予许多常见的范例访问data.frame列($,sapply,等).
然而"list",不是在data.frame对象的类列表中返回的项目之一:
dat <- data.frame(x=runif(100),y=runif(100),z=runif(100),g=as.factor(rep(letters[1:10],10)))
> class(dat)
[1] "data.frame"
Run Code Online (Sandbox Code Playgroud)
取消分类data.frame显示它是一个列表:
> class(unclass(dat))
[1] "list"
Run Code Online (Sandbox Code Playgroud)
如果没有data.frame方法,测试它看起来像默认方法将优先调用list方法:
> f <- function(x) UseMethod('f')
> f.default <- function(x) cat("Default")
> f.list <- function(x) cat('List')
> f(dat)
Default
> f.data.frame <- function(x) cat('DF')
> f(dat)
DF
Run Code Online (Sandbox Code Playgroud)
那么两个问题:
data.frame正式继承是否list有任何优势?data.frames视为列表的函数如何知道将它们视为列表?看起来lapply它看起来很快就会转到C内部代码,所以也许就是这样,但我的思绪在这里有点夸张.每当我在R中看到关于并行处理的问题时,它就会使用该foreach函数.由于for循环不是很像R,是否有并行版本apply,如果是这样,为什么它不是更受欢迎?
我正在使用ggplot的geom_tile做一个因子面对的2-D密度图.每个方面的比例从所有数据的最小值到所有数据的最大值,但每个方面中的geom_tile仅扩展到该方面中绘制的数据范围.
演示此问题的示例代码:
library(ggplot2)
data.unlimited <- data.frame(x=rnorm(500), y=rnorm(500))
data.limited <- subset(data.frame(x=rnorm(500), y=rnorm(500)), x<1 & y<1 & x>-1 & y>-1)
mydata <- rbind(data.frame(groupvar="unlimited", data.unlimited),
data.frame(groupvar="limited", data.limited))
ggplot(mydata) +
aes(x=x,y=y) +
stat_density2d(geom="tile", aes(fill = ..density..), contour = FALSE) +
facet_wrap(~ groupvar)
Run Code Online (Sandbox Code Playgroud)
运行代码,您将看到两个方面.一个方面显示"无限"随机正态分布的密度图.第二个方面显示一个随机法线截断,位于原点周围的2x2方格内."有限"刻面中的几何体将被限制在这个小盒子内,而不是填充刻面.
last_plot() +
scale_x_continuous(limits=c(-5,5)) +
scale_y_continuous(limits=c(-5,5))
Run Code Online (Sandbox Code Playgroud)

最后三行绘制了具有指定x和y限制的相同数据,并且我们看到在这种情况下,两个facet都没有将tile部分扩展到边缘.
有没有办法强制每个方面的geom_tile延伸到facet的整个范围?
我遇到了一个问题MNP,我跟踪了一个不幸的调用deparse(最大宽度限制为500个字符).
背景(如果你感到无聊,可轻松跳过)
因为mnp使用一些特殊的语法来允许变化的选择集(包含cbind(choiceA,choiceB,...)在公式定义中),我的公式调用的左侧在model.matrix.default调用deparse它时是1700个字符左右.由于deparse最多支持width.cutoff500个字符,因此该sapply(attr(t, "variables"), deparse, width.cutoff = 500)[-1L]行model.matrix.default的第一个元素为:
[1] "cbind(plan1, plan2, plan3, plan4, plan5, plan6, plan7, plan8, plan9, plan10, plan11, plan12, plan13, plan14, plan15, plan16, plan17, plan18, plan19, plan20, plan21, plan22, plan23, plan24, plan25, plan26, plan27, plan28, plan29, plan30, plan31, plan32, plan33, plan34, plan35, plan36, plan37, plan38, plan39, plan40, plan41, plan42, plan43, plan44, plan45, plan46, plan47, plan48, plan49, plan50, plan51, …Run Code Online (Sandbox Code Playgroud) 我有很多来自国外的作者姓名用CSV,R读得很好.我正在尝试清理它们以便上传到Mechanical Turk(它真的不喜欢一个国际化的角色).这样做,我有一个问题(稍后会发布),但我甚至dput不能以合理的方式表达它们:
> dput(df[306,"primauthfirstname"])
"Gwena\xeblle M"
> test <- "Gwena\xeblle M"
<simpleError in nchar(val): invalid multibyte string 1>
Run Code Online (Sandbox Code Playgroud)
换句话说,dput工作得很好,但粘贴结果失败了.为什么不dput输出必要的信息以允许复制/粘贴回R(可能它需要做的就是在结构语句中添加编码属性?).我怎么做到这一点?
请注意,\xeb就R而言,这是一个有效的字符:
> gsub("\xeb","", turk.df[306,"primauthfirstname"] )
[1] "Gwenalle M"
Run Code Online (Sandbox Code Playgroud)
但是你不能单独评估字符 - 它是十六进制代码\ x ##或者什么都没有:
> gsub("\\x","", turk.df[306,"primauthfirstname"] )
[1] "Gwena\xeblle M"
Run Code Online (Sandbox Code Playgroud) 我有一堆数据,我在县一级绘制,没有边界.我想加入州界.我有一个状态shapefile(多边形),但spplot似乎没有任何方法可以添加到上一个地图之上.有没有办法做到这一点,没有重写面板功能,以采取两个SPDF(这似乎非常专业的可能是其他人的问题)?
这是一个可重复的例子:
library(sp)
Srs1 = Polygons(list(Polygon(cbind(c(2,4,4,1,2),c(2,3,5,4,2)))), "s1")
Srs2 = Polygons(list(Polygon(cbind(c(5,4,2,5),c(2,3,2,2)))), "s2")
county <- SpatialPolygonsDataFrame( SpatialPolygons(list(Srs1,Srs2)),
data.frame( z=1:2, row.names=c("s1","s2") ) )
SrsA <- Polygons(list(Polygon(cbind(c(3,5,5,1,3),c(3,4,6,5,3)))),"sA")
state <- SpatialPolygonsDataFrame( SpatialPolygons(list(SrsA)),
data.frame( z=1,row.names="sA" ))
spplot( county, zcol="z",col=NA )
spplot( state, add=TRUE ) # Note the add=TRUE does nothing here, but that's the spirit of what I want to accomplish
Run Code Online (Sandbox Code Playgroud) 我想知道如何在dt给定字符向量的data.table中确定列的类w.
可重复的例子:
dt <- data.table(matrix(1:10, 2))
w <- "V1"
Run Code Online (Sandbox Code Playgroud)
当您直接按名称指定列时,它将返回向量,以便您可以获取其类:
> dt[,V1]
[1] 1 2
> class(dt[,V1])
[1] "integer"
Run Code Online (Sandbox Code Playgroud)
但是,将其指定为字符向量,而是返回单列data.table:
> dt[,w,with=FALSE]
V1
1: 1
2: 2
> class(dt[,w,with=FALSE])
[1] "data.table" "data.frame"
Run Code Online (Sandbox Code Playgroud)
我有点想要采用以下解决方案,但肯定有更好的方法:
dt[,eval(parse(text=paste0("class(",w,")")))]
Run Code Online (Sandbox Code Playgroud)
所以有两个问题:
classdata.table环境中的调用获得的速度?sapply( myDataFrame, class)?我正在尝试运行一个弹性网.从LASSO开始,然后从那里开始.我可以让它直接运行但是当我尝试train在caret包中运行相同的参数时它会失败.我想开始train工作,以便我可以用它来评估模型参数.
# Works
test <- enet( x=x, y=y, lambda=0, trace=TRUE, normalize=FALSE, intercept=FALSE )
# Doesn't
enetGrid <- data.frame(.lambda=0,.fraction=c(.01,.001,.0005,.0001))
ctrl <- trainControl( method="repeatedcv", repeats=5 )
> test2 <- train( x, y, method="enet", tuneGrid=enetGrid, trControl=ctrl, preProc=NULL )
fraction lambda RMSE Rsquared RMSESD RsquaredSD
1 1e-04 0 NaN NaN NA NA
2 5e-04 0 NaN NaN NA NA
3 1e-03 0 NaN NaN NA NA
4 1e-02 0 NaN NaN NA NA
Error in train.default(x, y, method …Run Code Online (Sandbox Code Playgroud)