小编geo*_*try的帖子

data.frame方法最有效的列表?

刚刚和同事谈过这个问题,我们认为看看SO土地上的人们不得不说出来是值得的.假设我有一个包含N个元素的列表,其中每个元素都是长度为X的向量.现在假设我想将其转换为data.frame.与R中大多数事情一样,有剥皮众所周知的猫的多种方式,比如as.dataframe,使用plyr包,comboing do.callcbind,预分配的DF和填充它,和其他人.

提出的问题是当N或X(在我们的例子中是X)变得非常大时会发生什么.当效率(特别是在记忆方面)至关重要时,是否有一种猫皮肤方法显着优越?

performance memory-management r dataframe data.table

33
推荐指数
2
解决办法
5504
查看次数

用最接近的值替换R中的NA

我正在寻找类似于包na.locf()中的东西zoo,但不是总是使用之前的NA值我想使用最接近的NA值.一些示例数据:

dat <- c(1, 3, NA, NA, 5, 7)
Run Code Online (Sandbox Code Playgroud)

替换NAna.locf(3继续):

library(zoo)
na.locf(dat)
# 1 3 3 3 5 7
Run Code Online (Sandbox Code Playgroud)

na.locffromLast组到TRUE(5向后携带):

na.locf(dat, fromLast = TRUE)
# 1 3 5 5 5 7
Run Code Online (Sandbox Code Playgroud)

但我希望使用最接近的NA值.在我的例子中,这意味着3应该被转发到第一个NA,而5应该被转发到第二个NA:

1 3 3 5 5 7
Run Code Online (Sandbox Code Playgroud)

我有一个编码的解决方案,但想确保我没有重新发明轮子.有什么东西已经浮动了吗?

仅供参考,我目前的代码如下.也许如果不出意外,有人可以建议如何提高效率.我觉得我错过了一个明显的改进方法:

  na.pos <- which(is.na(dat))
  if (length(na.pos) == length(dat)) {
    return(dat)
  } …
Run Code Online (Sandbox Code Playgroud)

r missing-data na

28
推荐指数
3
解决办法
6744
查看次数

R语言识别代码重新格式化/重构工具?

最近我发现自己在编码风格方面使用了R代码 - 多个作者和个人作者,他们并不严格遵守单一结构.有些任务我想比现在更好地自动化.

我正在寻找一种管理以下任务的工具(或多种工具) - 按照欲望的增加顺序列出,但也有点依赖于存在的怀疑主义.

  • 基本格式.比如将"if(foo)"转换为"if(foo)"并在支撑位置和类似物方面实现一致性.

  • 将"foo $ blah"转换为"foo [["blah"]]"以获取列表访问权限.理想情况下,它至少可以猜测一个对象是否真的是一个列表而不是data.frame并且只能转换列表.

  • 将'='转换为'< - '.是的,这是一个简单的搜索和替换 - 但不是真的.工具(或regexp)需要具有语言感知能力,以便它知道转换"x = 5"而不是"foo(x = 5)".不仅简单地替换符号而且确保赋值运算符两侧的单个空格也是非常好的.

  • 变量重命名,特别是跨功能和文件.例如,假设一个列表有一个元素"foo",我希望能够将它改为"foobar"一次,而不必在整个代码流中追踪该列表的每个用法.我想这将需要该工具能够进行整个控制流程,以便识别诸如在不同函数中作为另一个名称存在的列表之类的事物.

  • 命名约定.我希望能够定义一些标准的命名约定(例如Google或其他)并让它识别所有函数,变量等并转换它们.请注意,这与列表元素之类的内容相关联.

随意列出基本的unix处理命令(例如sed),只要它真的足够智能,至少通常不会搞砸(例如将"foo(x = 5)"转换为"foo(x <-5)" ").

我猜测,如果这样的工具,我会听到它的一个完美的状态现在已经存在了,而且我也意识到,与如R语言,很难做一些这些类型的变化的自动的,但是人们可以做梦吧?有没有人对这些/所有这些有指针?

refactoring r automated-refactoring

27
推荐指数
1
解决办法
1373
查看次数

确保R环境中的重现性

我在计算生物学实验室工作,在那里我们有几个人从事多个项目,主要是在R(这是我关心的这篇文章).在过去,人们只需为每个项目开发代码,这些代码可能涉及也可能不涉及从先前项目复制的样板代码.多年来我推动的一件事就是为这个混乱带来一些集中式结构,并让人们识别出常见的模式,这样我们就可以将这些重复/共同的代码块转换成包,因为人们可能会认为这是很多原因.一件好事.所以现在我们的人们在他们的项目特定脚本中使用了集中的包/例程.

这里有一个问题.我们拥有权力的授权,即每个项目的每个脚本都需要尽可能100%可重复(这包括我们可以直接访问的所有代码的100%,包括我们的包).也就是说,如果我在包条中使用参数A调用函数foo来获取结果X,那么4年后我应该得到完全相同的结果.(由于错误导致的错误输出在这里除外)

可重复性的主题现在在各个圈内的R中出现,但通常似乎在过程的再现性(例如,晕影)方面进行讨论.这不是一回事 - 我今天可以运行一个小插图然后在6个月后使用更新的包运行相同的代码并获得截然不同的结果.

已经达成一致的解决方案(我不是其中的粉丝)是,如果需要在非向后兼容的更改中更改函数或包,则只需获取新名称.因此,如果我们需要从根本上改变函数foo(),它将被称为foo2(),如果需要彻底改变,它将被称为foo3().这可以确保调用foo()的任何脚本始终获得原始结果,同时允许事物在包存储库中前进.它确实有效,但我真的不喜欢这个 - 它在美学上看起来非常混乱,我担心随着时间的推移它会导致包裹bar,bar2,bar3,bar4 ...函数foo1,foo2,foo3等的大规模混乱.

问题是我没有提出一个更好的替代解决方案.一种可能性是注意软件包的版本号,R等,并确保加载它们,但这有多个问题 - 其中最重要的是它依赖于正确的软件包版本规则并且容易出错.此外,这种替代方案已被拒绝;)理想情况下,我们所拥有的是某种开发和释放的概念,因为大多数这些变化往往更早发生,然后平稳发生变化的频率更低.OTOH devel在这里真正意味着"实际上并不是在一个包中"(我们这样做),但很难确切地确定在什么时候运送东西是正确的.当你认为自己安全的那一刻,那就是你认识到的那一刻

所以考虑到所有这些,我很好奇是否有其他人处理过类似情况,以及他们如何解决问题.

编辑:只是为了清楚,通过非向后兼容,我不只是谈论API等,而是输出给定的一组输入.

r

26
推荐指数
4
解决办法
715
查看次数

用Python直接重新创建Postgres COPY?

我有一个数据块,目前作为n元组的列表,但格式非常灵活,我想附加到Postgres表 - 在这种情况下,每个n元组对应于DB中的一行.

到目前为止我一直在做的是将这些全部写入CSV文件,然后使用postgres的COPY将所有这些内容加载到数据库中.这是有效的,但是不是最理想的,我更愿意直接从python中完成这一切.在python中是否有一种方法可以在Postgres中复制COPY类型的批量加载?

python postgresql psycopg2

18
推荐指数
1
解决办法
7781
查看次数

使用Oracle SQL Developer将CLOB导出到文本文件

我正在使用Oracle SQL Developer并尝试将表导出为CSV文件.某些字段是CLOB字段,在许多情况下,导出发生时会截断条目.我正在寻找一种方法来解决所有问题,因为我的最终目标是不在这里使用Oracle(我收到了一个Oracle转储 - 它被加载到一个oracle数据库中,但我正在使用其他格式的数据,所以通过CSV作为中间人).

如果对此有多种解决方案,鉴于对我来说这是一次性程序,我不介意更多涉及"做正确"解决方案的黑客类型解决方案.

sql oracle clob oracle-sqldeveloper

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

在R中查找范围重叠

我有两个data.frames,每个都有三列:chrom,start和stop,让我们称它们为rangesA和rangesB.对于每行rangeA,我想找到rangeB中哪一行(如果有的话)完全包含rangesA行 - 我的意思是rangesAChrom == rangesBChrom, rangesAStart >= rangesBStart and rangesAStop <= rangesBStop.

现在我正在做以下,我不太喜欢.请注意,由于其他原因,我正在循环遍历rangeA的行,但这些原因都不是什么大问题,它最终会让这些特定解决方案更具可读性.

rangesA:

chrom   start   stop
 5       100     105
 1       200     250
 9       275     300
Run Code Online (Sandbox Code Playgroud)

rangesB:

chrom    start    stop
  1       200      265
  5       99       106
  9       275      290
Run Code Online (Sandbox Code Playgroud)

对于范围A中的每一行:

matches <- which((rangesB[,'chrom']  == rangesA[row,'chrom']) &&
                 (rangesB[,'start'] <= rangesA[row, 'start']) &&
                 (rangesB[,'stop'] >= rangesA[row, 'stop']))
Run Code Online (Sandbox Code Playgroud)

我认为必须有一个更好的(并且更好,我的意思是比大范围A和rangeB的大型实例更快)这样做的方式比循环这个结构.有任何想法吗?

r bioinformatics

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

在R中的引用类的initialize()方法中自动赋值

我正在使用一个带有几十个字段的引用类.我已经设置了一个initialize()采用列表对象的方法.虽然有些字段依赖于列表元素的进一步计算,但大多数字段都是从列表元素直接分配的:

fieldA <<- list$A
fieldB <<- list$B
Run Code Online (Sandbox Code Playgroud)

我当时觉得自动化这个很好.举一个R伪代码的例子(这个例子显然不起作用):

for (field in c('A', 'B', 'C', 'D'))
   field <<- list[[field]]
Run Code Online (Sandbox Code Playgroud)

我已经尝试过几次结束运行<<-,例如:

for field in c('A', 'B', 'C', 'D'))
  do.call('<<-' c(field, list[[field]])) 
Run Code Online (Sandbox Code Playgroud)

但没有骰子.

我的猜测是,在目前的参考类化身中,这种行为根本不可能,但是认为在SO土地上有人知道有更好的方法可以做到这一点可能是值得的.

r reference-class

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

rbind()返回一个奇怪的结果

这有一些显而易见的愚蠢迹象,我会后悔在一个公共论坛上提出这个问题,但我现在已经让一些人难以接受了,所以我很高兴.

我正在运行以下代码块,但没有得到我期望的结果:

zz <- list(a=list('a', 'b', 'c', 'd'), b=list('f', 'g', '2', '1'),
           c=list('t', 'w', 'x', '6'))
padMat <- do.call('cbind', zz)
headMat <- matrix(c(colnames(padMat), rep('foo', ncol(padMat))), nrow=2, byrow=TRUE)
rbind(headMat, padMat)
Run Code Online (Sandbox Code Playgroud)

我原以为:

a    b    c
foo  foo  foo
a    f    t
b    g    w
c    2    x
d    1    6
Run Code Online (Sandbox Code Playgroud)

相反,我得到:

a    b    c
a    f    t 
b    g    w
c    2    x
d    1    6
NULL NULL NULL
Run Code Online (Sandbox Code Playgroud)

它似乎是按行填充rbind的上半部分,然后在末尾添加一行NULL值.

几个笔记:

  • 只要headMat是单行,这就可以使用AOK

  • 为了仔细检查,我也摆脱了padMat的dimnames,这并没有影响到事情

  • 另一个想法是它以某种方式与byrow = TRUE有关,但是如果你把它拿出来也会发生同样的行为

r

8
推荐指数
3
解决办法
1220
查看次数

在grep'd字符串后获取文件中的所有内容

昨天出现了一种情况,有人需要我将文件的尾端分开,指定为特定字符串之后的所有内容(为了参数,"FOO").我需要立即这样做,所以选择了我知道会工作并忽略了正确的方式或最好的方式,并采取以下措施:

grep -n FOO FILE.TXT | cut -f1 -d":" | xargs -I{} tail -n +{} FILE.TXT > NEWFILE.TXT
Run Code Online (Sandbox Code Playgroud)

让我烦恼的是使用xargs作为单例值.我认为我可以在这方面展示我的Google-Fu,但有兴趣看看SO-land中的人们为这种情况想出了什么样的东西

unix bash shell grep

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