小编Ari*_*man的帖子

为sort.data.frame创建通用/方法一致性的最佳方法?

我终于决定将在互联网上浮动的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)

generics methods r class

8
推荐指数
2
解决办法
1960
查看次数

使用强制转换重塑多个变量

我有一个看起来像这样的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)

r reshape

8
推荐指数
2
解决办法
6712
查看次数

为什么class(data.frame(...))不显示列表继承?

人们常常说,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)

那么两个问题:

  1. 从设计的角度来看,未能data.frame正式继承是否list有任何优势?
  2. 那些似乎将data.frames视为列表的函数如何知道将它们视为列表?看起来lapply它看起来很快就会转到C内部代码,所以也许就是这样,但我的思绪在这里有点夸张.

r r-s3

8
推荐指数
1
解决办法
433
查看次数

R并行扩展是否打破了`apply`这个比喻?

每当我在R中看到关于并行处理的问题时,它就会使用该foreach函数.由于for循环不是很像R,是否有并行版本apply,如果是这样,为什么它不是更受欢迎?

parallel-processing r apply

7
推荐指数
1
解决办法
559
查看次数

我如何强制ggplot的geom_tile填充每个方面?

我正在使用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的整个范围?

r ggplot2

7
推荐指数
1
解决办法
4150
查看次数

强制包的功能使用用户提供的功能

我遇到了一个问题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)

debugging r

7
推荐指数
1
解决办法
166
查看次数

如何正确地输入国际化文本?

我有很多来自国外的作者姓名用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)

r internationalization

7
推荐指数
1
解决办法
403
查看次数

使用spplot过度绘制两个SpatialPolygonsDataFrame

我有一堆数据,我在县一级绘制,没有边界.我想加入州界.我有一个状态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)

r spatial

7
推荐指数
1
解决办法
5342
查看次数

data.table列的类

我想知道如何在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)

所以有两个问题:

  1. 有没有更好的(更简洁)获得单个列的类(没有放弃上述解决方案通过评估classdata.table环境中的调用获得的速度?
  2. 有没有办法获得所有列的类的向量,无论如何sapply( myDataFrame, class)

r data.table

7
推荐指数
1
解决办法
1万
查看次数

enet()工作但不是通过caret :: train()运行时

我正在尝试运行一个弹性网.从LASSO开始,然后从那里开始.我可以让它直接运行但是当我尝试traincaret包中运行相同的参数时它会失败.我想开始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)

r machine-learning r-caret

7
推荐指数
1
解决办法
3585
查看次数