小编Aru*_*run的帖子

在大数据帧中生成指标

目标是为数据框中的因子/字符串变量创建指标.那个数据帧有> 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
查看次数

通过R中的数据子集执行计算

我想在我的数据框的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,我不明白) .有什么建议?

foreach r subset

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

ggplot2 +使用比例X的日期结构

我真的需要帮助,因为我迷失了.

我正在尝试创建一个折线图,显示一年内几支球队的表现.我把这一年分为四季: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)

r ggplot2

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

将字符向量拆分为数据框中的新行的最快方法

我不确定如何在搜索时正确说出这一点,很抱歉,如果这有一个简单的答案.

我有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)

我不知道连续的最大数量是多少.

split r

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

根据名称选择列表元素

我有一个命名的矢量列表,代表源自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)

感谢我帮助我做错了什么.

r list

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

通过函数传递表达式

我正在使用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().所以,如果你还能解释如何让它发挥作用,那就太棒了.

expression r data.table

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

比较data.table中的连续行并替换行值

我在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)

r data.table

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

在r中的data.table中使用lapply中的函数

如果有如下样本数据集.

> 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)

r lapply data.table

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

有条件地填充数据帧的行

我有一个这个结构的数据框,我想填充:

    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)

r dataframe

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

data.table中是否有一种方法可以根据标识符按组分配ID?

假设我的数据如下:

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中是否有一种简单的方法可以做到这一点.我尝试过像循环这样的东西但是在更高的尺寸上变得更难.任何建议将不胜感激,谢谢!

r data.table

5
推荐指数
2
解决办法
407
查看次数

标签 统计

r ×10

data.table ×4

dataframe ×2

expression ×1

foreach ×1

ggplot2 ×1

lapply ×1

list ×1

memory ×1

plyr ×1

reshape2 ×1

split ×1

subset ×1