小编Aru*_*run的帖子

在预先排序的列中合并R中的数据帧?

我通常使用大型数据帧,这些数据帧排序很好(或者可以很容易地排序).

给定两个数据帧,两者都按'用户'排序

some.data <user> <data_1> <data_2> 
user <user> <user_attr_1> <user_attr_2>
Run Code Online (Sandbox Code Playgroud)

我跑m = merge(some.data,user),我得到的结果如下:

m = <user> <data_1> <data_2> <user_attr_1> <user_attr_2>
Run Code Online (Sandbox Code Playgroud)

这很好.

但是merge没有利用这些数据帧在公共列上排序,使得合并相当漂亮的CPU /内存很重.但是,这个合并可以在O(n)中完成

我想知道在R中是否有办法对排序数据集进行有效合并?

merge r dataframe

6
推荐指数
1
解决办法
653
查看次数

更快的方法来创建通过id聚合列的变量

有更快的方法吗?我想这是不必要的慢,并且这样的任务可以通过基本功能完成.

df <- ddply(df, "id", function(x) cbind(x, perc.total = sum(x$cand.perc)))
Run Code Online (Sandbox Code Playgroud)

我是很新的R.我已经看过了by(),aggregate()tapply(),但并没有让他们在所有或我想要的方式工作.我希望将总和附加到原始数据帧,而不是返回较短的向量.做这个的最好方式是什么?

编辑:这是应用于我的数据的答案的速度比较.

> # My original solution
> system.time( ddply(df, "id", function(x) cbind(x, perc.total = sum(x$cand.perc))) )
   user  system elapsed 
 14.405   0.000  14.479 

> # Paul Hiemstra
> system.time( ddply(df, "id", transform, perc.total = sum(cand.perc)) )
   user  system elapsed 
 15.973   0.000  15.992 

> # Richie Cotton
> system.time( with(df, tapply(df$cand.perc, df$id, sum))[df$id] )
   user  system elapsed 
  0.048   0.000   0.048 

> # John
> system.time( …
Run Code Online (Sandbox Code Playgroud)

performance aggregate r plyr

6
推荐指数
2
解决办法
2945
查看次数

数据框子集性能

我有几个大数据帧(100万+行x 6-10列)我需要重复子集.子集化部分是我的代码中最慢的部分,我很好奇是否有办法更快地完成这项工作.

load("https://dl.dropbox.com/u/4131944/Temp/DF_IOSTAT_ALL.rda")
start_in <- strptime("2012-08-20 13:00", "%Y-%m-%d %H:%M")
end_in<- strptime("2012-08-20 17:00", "%Y-%m-%d %H:%M")
system.time(DF_IOSTAT_INT <- DF_IOSTAT_ALL[DF_IOSTAT_ALL$date_stamp >= start_in & DF_IOSTAT_ALL$date_stamp <= end_in,])

> system.time(DF_IOSTAT_INT <- DF_IOSTAT_ALL[DF_IOSTAT_ALL$date_stamp >= start_in & DF_IOSTAT_ALL$date_stamp <= end_in,])
   user  system elapsed 
  16.59    0.00   16.60 

dput(head(DF_IOSTAT_ALL))
structure(list(date_stamp = structure(list(sec = c(14, 24, 34, 
44, 54, 4), min = c(0L, 0L, 0L, 0L, 0L, 1L), hour = c(0L, 0L, 
0L, 0L, 0L, 0L), mday = c(20L, 20L, 20L, 20L, 20L, 20L), mon = c(7L, 
7L, 7L, 7L, …
Run Code Online (Sandbox Code Playgroud)

performance r subset dataframe

6
推荐指数
1
解决办法
1232
查看次数

基于向量子集索引数据帧

我有一个非常大的数据帧,我想根据矢量的某个子集保存一个子集.总之,我有这样的事情:

> id<-c("ID1","ID2","ID2","ID3","ID4","ID4","ID4","ID4","ID4")
> status<-c("flag","flag","none","none","flag","flag","flag","none","flag")
> misc1ofmany<-c("etc1","etc2","etc3","etc4","etc5","etc6","etc7","etc8","etc9")
> df = data.frame(id, status, misc1ofmany) ; df
   id status misc1ofmany
1 ID1   flag        etc1
2 ID2   flag        etc2
3 ID2   none        etc3
4 ID3   none        etc4
5 ID4   flag        etc5
6 ID4   flag        etc6
7 ID4   flag        etc7
8 ID4   none        etc8
9 ID4   flag        etc9
Run Code Online (Sandbox Code Playgroud)

我想要标记所有已标记的ID行,包括其未标记的会话.现在我正试图通过grep获取其他ID的索引并将其插回到新的df中.实际上,当我写出来时,我发现grepl可能更容易使用:

> flaggedIDs <- unique(as.vector(df$id[grep("flag",df$status)]))
> flaggedIDs.allStats.Index <- mapply(grepl,df$id,MoreArgs=list(x=flaggedIDs)) 
> flaggedIDs.allStats.Index
      [,1]  [,2]  [,3]  [,4]  [,5]  [,6]  [,7]  [,8]  [,9]
[1,]  TRUE FALSE FALSE FALSE FALSE …
Run Code Online (Sandbox Code Playgroud)

r subset dataframe

6
推荐指数
1
解决办法
328
查看次数

当一组参数被粘贴()作为向量时,如何获得glm模型中R的真实残余偏差和自由度

我正在编写一个脚本(在python中,在pypeR中使用R部分),这样我就需要在R中使用一个函数来比较两个模型的F比率测试.

模型是这样的:

模型1: Response ~ Predictor A + Predictor B + Predictor C.... + Predictor n
模型2: Response ~ Predictor 1

共同预测器A+B+...n组成Predictor 1,所以在这里嵌套没有问题(相信我).

当我传递Predictor A + Predictor B + Predictor C.... + Predictor n给我创建的函数时,我认为它将它们视为一个变量(因为自由度与之相同Model 2).也许这是因为我正在使用paste()?无论如何,模型1中的预测变量的实际数量将在不同的运行中发生变化(这就是我需要它作为函数的原因),所以我不确定除了使用之外还有什么方法可以适应它paste().

请记住,粘贴实际上可能不是问题所在; 我只是想让人们知道认为问题可能存在.

是否有任何建议,我怎么可能会获得对真实残余偏差和自由度model 1?它可能是一个黑客.例如,我只是减去length(vector of predictors) - 1获得自由度.我不知道残余偏差的类似黑客是什么.

这是函数和示例实例化:

make_and_compare_models <- function(fitness_trait_name, data_frame_name, vector_for_multiple_regression, predictor_for_single_regression, fam){
    fit1<-glm(formula=as.formula(paste(fitness_trait_name,"~", paste(vector_for_multiple_regression, sep="+"))), family=fam, data=data_frame_name)
    #print ('length …
Run Code Online (Sandbox Code Playgroud)

regression r anova glm

6
推荐指数
1
解决办法
1851
查看次数

有条件地从数据框中删除行(多个条件)

我已经搜索了SO,虽然有很多关于有条件删除行的QA但没有QA适合我的问题.

我有一个data.frame可变的含纵向测量x,y...,在各个时间点等time,在若干受试者id.一些受试者经历事件ev(表示为1,否则0在某些情况下time).我想将初始值减少data.frame到:

  • 1)所有具有未经历过事件的主题的行(好的,那很容易)但也包括
  • 2)对于经历过事件的主体,事件之前的所有行(即所有行的次数都少于该个体事件发生的时间).

以便,

testdf<-data.frame(id=c(rep("A",4),rep("B",4),rep("C",4) ),
                   x=c(NA, NA, 1,2, 3, NA, NA, 1, 2, NA,NA, 5), 
                   y=rev(c(NA, NA, 1,2, 3, NA, NA, 1, 2, NA,NA, 5)),
                   time=c(1,2,3,4,0.1,0.5,10,20,3,2,1,0.5),
                   ev=c(0,0,0,0,0,1,0,0,0,0,0,1))
Run Code Online (Sandbox Code Playgroud)

会减少到

   id  x  y time ev
1   A NA  5  1.0  0
2   A NA NA  2.0  0
3   A  1 NA  3.0  0
4   A  2  2  4.0  0
5 …
Run Code Online (Sandbox Code Playgroud)

conditional r dataframe

6
推荐指数
1
解决办法
1744
查看次数

如何将数据列保留为数据帧

问题:如何提取一列数据框并保持其结构不变?

data <- iris
data[, 1] ##this will be a vector and will lose the name of the column in dataframe
Run Code Online (Sandbox Code Playgroud)

r dataframe

6
推荐指数
2
解决办法
173
查看次数

将编码应用于整个Data.Table

我将以下文件读入data.table,如下所示:

raw <- fread("avito_train.tsv", nrows=1000)
Run Code Online (Sandbox Code Playgroud)

然后,如果我改变特定列和行的编码,如下所示:

Encoding(raw$title[2]) <- "UTF-8"
Run Code Online (Sandbox Code Playgroud)

它完美地运作.

但是,如何将编码应用于所有列和所有行?

我检查了fread文档,但似乎没有任何编码选项.此外,我试过,Encoding(raw)但这给了我一个错误(预期的字符向量参数).

编辑:本文详细介绍了有关Windows上RStudio中外来文本的更多信息http://quantifyingmemory.blogspot.com/2013/01/r-and-foreign-characters.html

encoding r dataframe data.table

6
推荐指数
2
解决办法
6881
查看次数

按多个条件匹配和替换数据框的列

干杯,我有两个数据框,具有以下结构.

DF1:
Airlines           HeadQ      Date           Cost_Index
American           PHX        07-31-2016     220
American           ATL        08-31-2016     150
American           ATL        10-31-2016     150
Delta              ATL        10-31-2016     180
American           ATL        08-31-2017     200
Run Code Online (Sandbox Code Playgroud)

第二数据帧DF2具有以下结构:

DF2:
Airlines           HeadQ      Date          
American           ATL        09-30-2016
Delta              ATL        03-31-2017
Run Code Online (Sandbox Code Playgroud)

现在查看数据帧DF1和DF2,我想将DF1改为以下数据帧.

DF1:
Airlines           HeadQ      Date           Cost_Index
American           PHX        07-31-2016     220
American           ATL        08-31-2016     0
American           ATL        10-31-2016     150
Delta              ATL        10-31-2016     180
American           ATL        08-31-2017     200
Run Code Online (Sandbox Code Playgroud)

条件是,从DF2查找DF1的航空公司和HeadQ,如果DF1 $ Date <DF2 $ Date,则将Cost_Index设为0,否则继续使用Cost_Index.

我尝试了,但未成功,:

DF1$Cost_Index <- ifelse(DF1$Airlines == DF2$Airlines & DF1$HeadQ == DF2$HeadQ 
        & …
Run Code Online (Sandbox Code Playgroud)

datetime r dataframe dplyr

6
推荐指数
1
解决办法
627
查看次数

在大数据帧中生成指标

目标是为数据框中的因子/字符串变量创建指标.那个数据帧有> 2mm的行,并且在Windows上运行R,我没有选择使用plyr和.parallel = T. 所以我正在与plyr和reshape2一起采取"分而治之"的路线.

运行融化和强制转换耗尽内存,并使用

ddply( idata.frame(items) , c("ID") , function(x){
       (    colSums( model.matrix( ~ x$element - 1) ) > 0   )
} , .progress="text" )    
Run Code Online (Sandbox Code Playgroud)

要么

ddply( idata.frame(items) , c("ID") , function(x){
           (    elements %in% x$element   )
    } , .progress="text" )  
Run Code Online (Sandbox Code Playgroud)

确实需要一段时间.最快的方法是调用下面的tapply.你有没有办法加快速度?%in语句的运行速度比model.matrix调用快.谢谢.

set.seed(123)

dd <- data.frame(
  id  = sample( 1:5, size=10 , replace=T ) ,
  prd = letters[sample( 1:5, size=10 , replace=T )]
  )

prds <- unique(dd$prd)

tapply( dd$prd , dd$id , function(x) prds %in% x )
Run Code Online (Sandbox Code Playgroud)

memory r plyr dataframe reshape2

5
推荐指数
1
解决办法
201
查看次数