我通常使用大型数据帧,这些数据帧排序很好(或者可以很容易地排序).
给定两个数据帧,两者都按'用户'排序
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中是否有办法对排序数据集进行有效合并?
有更快的方法吗?我想这是不必要的慢,并且这样的任务可以通过基本功能完成.
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) 我有几个大数据帧(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) 我有一个非常大的数据帧,我想根据矢量的某个子集保存一个子集.总之,我有这样的事情:
> 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) 我正在编写一个脚本(在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) 我已经搜索了SO,虽然有很多关于有条件删除行的QA但没有QA适合我的问题.
我有一个data.frame可变的含纵向测量x,y...,在各个时间点等time,在若干受试者id.一些受试者经历事件ev(表示为1,否则0在某些情况下time).我想将初始值减少data.frame到:
以便,
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) 问题:如何提取一列数据框并保持其结构不变?
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) 我将以下文件读入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
干杯,我有两个数据框,具有以下结构.
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) 目标是为数据框中的因子/字符串变量创建指标.那个数据帧有> 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) r ×10
dataframe ×8
performance ×2
plyr ×2
subset ×2
aggregate ×1
anova ×1
conditional ×1
data.table ×1
datetime ×1
dplyr ×1
encoding ×1
glm ×1
memory ×1
merge ×1
regression ×1
reshape2 ×1