目标是为数据框中的因子/字符串变量创建指标.那个数据帧有> 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) 我想在我的数据框的PERMNO列中对每个公司编号执行计算,其摘要可以在这里看到:
> summary(companydataRETS)
PERMNO RET
Min. :10000 Min. :-0.971698
1st Qu.:32716 1st Qu.:-0.011905
Median :61735 Median : 0.000000
Mean :56788 Mean : 0.000799
3rd Qu.:80280 3rd Qu.: 0.010989
Max. :93436 Max. :19.000000
Run Code Online (Sandbox Code Playgroud)
到目前为止,我的解决方案是创建一个包含所有公司编号的变量
compns <- companydataRETS[!duplicated(companydataRETS[,"PERMNO"]),"PERMNO"]
Run Code Online (Sandbox Code Playgroud)
然后使用并行计算的foreach循环调用我的函数get.rho(),然后执行所需的计算
rhos <- foreach (i=1:length(compns), .combine=rbind) %dopar%
get.rho(subset(companydataRETS[,"RET"],companydataRETS$PERMNO == compns[i]))
Run Code Online (Sandbox Code Playgroud)
我测试了它的一部分数据,一切正常.问题是我有7200万观察,即使在电脑一夜之间工作,它仍然没有完成.
我是R的新手,所以我想我的代码结构可以改进,并且有更好的(更快,更少计算密集)的方式来执行同样的任务(也许使用apply或with,我不明白) .有什么建议?
我真的需要帮助,因为我迷失了.
我正在尝试创建一个折线图,显示一年内几支球队的表现.我把这一年分为四季:2012年1月1日,2012年4月1日.12年8月1日.12/1/12并将csv数据帧加载到R.
Month Team Position
1 1/1/12 South Africa 56
2 1/1/12 Angola 85
3 1/1/12 Morocco 61
4 1/1/12 Cape Verde Islands 58
5 4/1/12 South Africa 71
6 4/1/12 Angola 78
7 4/1/12 Morocco 62
8 4/1/12 Cape Verde Islands 76
9 8/1/12 South Africa 67
10 8/1/12 Angola 85
11 8/1/12 Morocco 68
12 8/1/12 Cape Verde Islands 78
13 12/1/12 South Africa 87
14 12/1/12 Angola 84
15 12/1/12 Morocco 72
16 12/1/12 Cape Verde Islands …Run Code Online (Sandbox Code Playgroud) 我不确定如何在搜索时正确说出这一点,很抱歉,如果这有一个简单的答案.
我有58个数据帧,每行约25,000行.csv's.他们看起来像这样:
Probe.Id Gene.Id Score.d
1418126_at 6352 28.52578
145119_a_at 2192 24.87866
1423477_at NA 24.43532
1434193_at 100506144///9204 6.22395
Run Code Online (Sandbox Code Playgroud)
理想情况下,我想在"///"处拆分ID并将它们放在新行上.像这样:
Probe.Id Gene.Id Score.d
1418126_at 6352 28.52578
145119_a_at 2192 24.87866
1423477_at NA 24.43532
1434193_at 100506144 6.22395
1434193_at 9204 6.22395
Run Code Online (Sandbox Code Playgroud)
使用strsplit允许我将Gene.Id作为一个字符向量列表,但是一旦我有了这个,我不知道最有效的方法是使用另一个正确的值来获取每个单独的id在他们自己的行上列.理想情况下,我不想只循环25,000行.
如果有人知道正确的方法,我会非常感激.
编辑:我应该补充说,有一个复杂的因素,有些行有像这样的ID:
333932///126961///653604///8350///8354///8355///8356///8968///8352///8358///835??1///8353///8357"
Run Code Online (Sandbox Code Playgroud)
我不知道连续的最大数量是多少.
我有一个命名的矢量列表,代表源自2个样本的事件,"A"和"B":
l.temp <- list(
SF1_t_A = c(rep(1:10)),
SF2_t_A = c(rep(9:15)),
SF1_t_B = c(rep(8:12)))
l.temp
$SF1_t_A
[1] 1 2 3 4 5 6 7 8 9 10
$SF2_t_A
[1] 9 10 11 12 13 14 15
$SF1_t_B
[1] 8 9 10 11 12
Run Code Online (Sandbox Code Playgroud)
现在我想只选择列表中的元素来自样本"A"或"B".我可以用循环来做这件事,但当plyr出现时,这种情况无法使用列表.这个和变化是我到目前为止所尝试的:
llply(l.temp , function(l){
if ((unlist(strsplit(names(l), "_"))[3]) == "A"){
return(l)}
})
Run Code Online (Sandbox Code Playgroud)
这是我得到的错误:
Error in unlist(strsplit(names(l), "_")) :
error in evaluating the argument 'x' in selecting a method for function 'unlist':
Error in strsplit(names(l), "_") : non-character argument
Run Code Online (Sandbox Code Playgroud)
感谢我帮助我做错了什么.
我正在使用data.table包并尝试编写一个函数(如下所示):
require(data.table)
# Function definition
f = function(path, key) {
table = data.table(read.delim(path, header=TRUE))
e = substitute(key)
setkey(table, e) # <- Error in setkeyv(x, cols, verbose = verbose) : some columns are not in the data.table: e
return(table)
}
# Usage
f("table.csv", ID)
Run Code Online (Sandbox Code Playgroud)
在这里,我尝试将表达式传递给函数.为什么这段代码不起作用?
我已经尝试了不同的组合substitute(),quote()和eval().所以,如果你还能解释如何让它发挥作用,那就太棒了.
我在R中有一个data.table,它包含在不同时间点收集的每个用户的多个状态值.我想比较连续时间点的状态值,并在状态发生变化时用标志更新行.请参阅下面的示例
DT_A <- data.table(sid=c(1,1,2,2,2,3,3), date=as.Date(c("2014-06-22","2014-06-23","2014-06-22","2014-06-23", "2014-06-24","2014-06-22","2014-06-23")), Status1 = c("A","B","A","A","B","A","A"), Status2 = c("C","C","C","C","D","D","E"))
DT_A_Final <- data.table(sid=c(1,1,2,2,2,3,3), date=as.Date(c("2014-06-22","2014-06-23","2014-06-22","2014-06-23", "2014-06-24","2014-06-22","2014-06-23")), Status1 = c("0","1","0","0","1","0","0"), Status2 = c("0","0","0","0","1","0","1"))
Run Code Online (Sandbox Code Playgroud)
原始数据表DT_A是
sid date Status1 Status2
1 1 2014-06-22 A C
2 1 2014-06-23 B C
3 2 2014-06-22 A C
4 2 2014-06-23 A C
5 2 2014-06-24 B D
6 3 2014-06-22 A D
7 3 2014-06-23 A E
Run Code Online (Sandbox Code Playgroud)
最终所需的数据表是DT_A_final
sid date Status1 Status2
1 1 2014-06-22 0 0
2 1 2014-06-23 1 0
3 2 …Run Code Online (Sandbox Code Playgroud) 如果有如下样本数据集.
> tmp <- data.table(x=c(1:10),y=(5:14))
> tmp
x y
1: 1 5
2: 2 6
3: 3 7
4: 4 8
5: 5 9
6: 6 10
7: 7 11
8: 8 12
9: 9 13
10: 10 14
Run Code Online (Sandbox Code Playgroud)
我想选择两个最小的数字,我想要将0值更改为其他数字.
喜欢
x y
1: 1 5
2: 2 6
3: 0 0
4: 0 0
5: 0 0
6: 0 0
7: 0 0
8: 0 0
9: 0 0
10: 0 0
Run Code Online (Sandbox Code Playgroud)
我认为编码是
tmp[, c("x","y"):=lapply(.SD, x[which(!x %in% sort(x)[1:2])] = …Run Code Online (Sandbox Code Playgroud) 我有一个这个结构的数据框,我想填充:
V1 V2 V3 V4 V5 V6 V7 V8
1 ID_CODE 0 0 0 0 0 0 0
2 THIS 0 0 0 0 0 0 0
3 ISAROW 0 0 0 0 0 0 0
4 01 0 0 0 0 0 0 0
5 02 0 0 0 0 0 0 0
6 03 0 0 0 0 0 0 0
7 ID_CODE 0 0 0 0 0 0 0
8 THESE 0 0 0 0 0 0 …Run Code Online (Sandbox Code Playgroud) 假设我的数据如下:
Name Date
Bank1 1/1/2005
Bank1 6/1/2005
Bank1 1/1/2006
Bank1 6/1/2006
Bank1 1/1/2007
Bank2 6/1/2006
Bank2 1/1/2007
Bank3 6/1/2005
Bank3 1/1/2006
Bank3 6/1/2006
Bank3 1/1/2007
....
Run Code Online (Sandbox Code Playgroud)
这里的第一个日期是2005年1月1日,最后一个日期是1/1/2007.我想分配一个ID,我有:
Name Date ID
Bank1 1/1/2005 1
Bank1 6/1/2005 2
Bank1 1/1/2006 3
Bank1 6/1/2006 4
Bank1 1/1/2007 5
Bank2 6/1/2006 4
Bank2 1/1/2007 5
Bank3 6/1/2005 2
Bank3 1/1/2006 3
Bank3 6/1/2006 4
Bank3 1/1/2007 5
....
Run Code Online (Sandbox Code Playgroud)
我基本上想要为与所有日期的顺序相对应的日期分配ID.此外,Bank1拥有所有日期的完整列表.我想知道data.table中是否有一种简单的方法可以做到这一点.我尝试过像循环这样的东西但是在更高的尺寸上变得更难.任何建议将不胜感激,谢谢!