小编Aru*_*run的帖子

加速数据帧匹配

我有两个数据帧,很像这样:

data = data.frame(data=cbind(1:12,rep(c(1,2),6),rep(c(1,2,3),4)))
colnames(data)=c('v','h','c')

lookup = data.frame(data=cbind(c(rep(1,3),rep(2,3)),rep(c(1,2,3),2),21:26))
colnames(lookup)=c('h','c','t')
Run Code Online (Sandbox Code Playgroud)

我想从数据$ v中减去查找$ t,其中h和c列匹配.

我认为这样的事情会起作用

data$v-lookup$t[lookup$h==data$h&lookup$c==data$c]
Run Code Online (Sandbox Code Playgroud)

但并不神奇地知道我想隐式迭代数据行

我最终这样做了

myt = c()
for(i in 1:12) {
myt[i] = lookup$t[lookup$h==data$h[i]&lookup$c==data$c[i]]
}
Run Code Online (Sandbox Code Playgroud)

哪个工作正常,但我希望有人可以提出一个更合理的方式,不涉及循环.

performance r

7
推荐指数
2
解决办法
740
查看次数

如何有效地合并两个数据集?

我试图合并两个相当大的 - 但不是荒谬的(360,000 X 4,57,000 X 4) - 一个公共ID的数据集.我已经尝试了常规merge(),merge.data.table()sqldf().每次我的内存耗尽(cannot allocate vector of size...).这有什么解决方案吗?或者R是合并数据的坏工具吗?head()给出如下(我想在STUDENT.NAME上合并):

  ID10    STUDENT.NAME   FATHER.NAME MOTHER.NAME
1    1     DEEKSHITH J       JAYANNA      SWARNA
2    4    MANIKANTHA D       DEVARAJ     MANJULA
3    5        NAGESH T   THIMMAIAH N    SHIVAMMA
4    6    NIZAMUDDIN R NOOR MOHAMMED        BIBI
5    7 PRABHU YELLAPPA      YELLAPPA    MALLAMMA
6    8    SADDAM PASHA   NISAR AHMED     ZAREENA
Run Code Online (Sandbox Code Playgroud)

memory merge memory-management r dataframe

7
推荐指数
1
解决办法
7544
查看次数

将这个丑陋的for循环转换为更友好的R形式

一直在使用SO作为我工作的资源.感谢您召集这样一个伟大的社区.

我正在尝试做一些有点复杂的事情,我现在能想到的唯一方法就是使用一对嵌套的for循环(我知道在R中不赞成)......我有三百万的记录 - 奇数课程注册:学生UserID与CourseID配对.在每一行中,都有一堆数据,包括开始/结束日期和分数等等.我需要做的是,对于每次注册,计算该用户在注册课程之前所参加的课程的平均分数.

我用于for循环的代码如下:

data$Mean.Prior.Score <- 0
for (i in as.numeric(rownames(data)) {
    sum <- 0
    count <- 0
    for (j in as.numeric(rownames(data[data$UserID == data$UserID[i],]))) {
            if (data$Course.End.Date[j] < data$Course.Start.Date[i]) {
                sum <- sum + data$Score[j]
                count <- count + 1
            }
    }
if (count != 0)
    data$Mean.Prior.Score[i] <- sum / count
}
Run Code Online (Sandbox Code Playgroud)

我很确定这会起作用,但它的运行速度非常慢...我的数据框有超过三百万行,但经过10分钟的好处后,外部循环只运行了850条记录.这似乎比时间复杂性所暗示的要慢,特别是考虑到每个用户平均只有5或6个课程.

哦,我应该提一下,我在运行循环之前用as.POSIXct()转换了日期字符串,所以日期比较步骤不应该太慢......

必须有更好的方法来做到这一点...任何建议?


编辑:根据mnel的要求......终于得到dput了很好的发挥.不得不补充一下control = NULL.这是'tis:

structure(list(Username = structure(1:20, .Label = c("100225", 
"100226", "100228", "1013170", "102876", "105796", "106753", 
"106755", "108568", "109038", "110150", "110200", …
Run Code Online (Sandbox Code Playgroud)

loops aggregate r vectorization

7
推荐指数
1
解决办法
375
查看次数

将非数字因子转换为数字列,并在R中进行映射

我有一个因素data frame与像水平hot,warm,tepid,cold,very cold,freezing.我想将它们映射到一个整数列,其值在[-2, 2]回归范围内,一些值映射到同一个东西.我希望能够指定显式映射,以便将very hot单词映射到2,将单词映射very cold-2,等等.如何干净地执行此操作?我想要一个函数,我只是传递一些命名列表,或者其他什么.

r

7
推荐指数
2
解决办法
6852
查看次数

结合R中的列表

什么是一种简单快捷的方法:

x <- list(a1=2, b1=c(1,2), c1=1:3)
y <- list(a2=5, b2=c(2,5), c2=2:4)
Run Code Online (Sandbox Code Playgroud)

list(list(x$a1, y$a2), list(x$b1, y$b2), list(x$c1, y$c2))
Run Code Online (Sandbox Code Playgroud)

或者一般来说:

如果列表x和y具有相同的长度并且它们的元素的长度也相应,那么如何将它组合成单个列表,如上所示?

r list lapply data-structures mclapply

7
推荐指数
1
解决办法
7230
查看次数

基于二进制搜索的data.table中NA值的子集

我试图从我data.table的两行中的任何一个包含NA值的行中删除行.我想利用包中的J函数来利用二进制搜索data.table.这是我尝试过的:

DT = data.table(x=rep(c("a","b",NA),each=10), y=c(1,3,6))
setkey(DT,x)
DT
     x y
 1: NA 6
 2: NA 1
 3: NA 3
 4: NA 6
 5: NA 1
 6: NA 3
 7: NA 6
 8: NA 1
 9: NA 3
10: NA 6
11:  a 1
12:  a 3
13:  a 6
14:  a 1
15:  a 3
16:  a 6
17:  a 1
18:  a 3
19:  a 6
20:  a 1
21:  b 3 …
Run Code Online (Sandbox Code Playgroud)

r data.table

7
推荐指数
1
解决办法
268
查看次数

在 SQL 中有效地连接间隔范围

假设我有两个表如下(数据取自这篇SO post):

桌子d1

 x start end
 a     1   3
 b     5  11
 c    19  22
 d    30  39
 e     7  25
Run Code Online (Sandbox Code Playgroud)

桌子d2

 x pos
 a   2
 a   3
 b   3
 b  12
 c  20
 d  52
 e  10
Run Code Online (Sandbox Code Playgroud)

两个表中的第一行都是列标题。我想提取d2xd1和列匹配pos1并落在其中(包括边界值)d1的所有行。也就是说,我想要的结果是:startend

 x pos start  end
 a   2     1    3
 a   3     1    3
 c  20    19   22
 e  10     7   25
Run Code Online (Sandbox Code Playgroud)

到目前为止我看到的这样做的方式是:

SELECT * …
Run Code Online (Sandbox Code Playgroud)

mysql sql sqlite query-optimization intervals

7
推荐指数
1
解决办法
4403
查看次数

在预先排序的列中合并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
查看次数

为什么这么慢?(循环在DF行与独立向量)

我有一段代码,总耗时约为30秒,下面的代码大约是27秒.我将违规代码缩小到这个:

d$dis300[i] <- h
Run Code Online (Sandbox Code Playgroud)

所以我换到另一件,现在工作得非常快(正如预期的那样).

我的问题是为什么这对第二个太慢了.数据DF约为7500x18变量

第一:( 27秒过去了)

d$dis300 <- 0
for (i in 1:netot) {
  h <- aaa[d$ent[i], d$dis[i]]
  if (h == 0) writeLines(sprintf("ERROR. ent:%i dis:%i", d$ent[i], d$dis[i]))
  d$dis300[i] <- h
}
Run Code Online (Sandbox Code Playgroud)

第二:(0.2秒过去了)

d$dis300 <- 0
for (i in 1:netot) {
  h <- aaa[d$ent[i], d$dis[i]]
  if (h == 0) writeLines(sprintf("ERROR. ent:%i dis:%i", d$ent[i], d$dis[i]))
  foo[i] <- h
}
d$foo <- foo
Run Code Online (Sandbox Code Playgroud)

你可以看到两者都是"相同的",但有一个人有这个DF而不是一个向量.

任何评论都非常感谢.我来自另一种语言,这让我疯了一会儿.至少我有解决方案,但我希望将来能够防止这类问题.

谢谢你的时间,

performance r

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

按重复次数对数据帧进行子集

如果我有这样的数据帧:

neu <- data.frame(test1 = c(1,2,3,4,5,6,7,8,9,10,11,12,13,14), 
                  test2 = c("a","b","a","b","c","c","a","c","c","d","d","f","f","f"))
neu
   test1 test2
1      1     a
2      2     b
3      3     a
4      4     b
5      5     c
6      6     c
7      7     a
8      8     c
9      9     c
10    10     d
11    11     d
12    12     f
13    13     f
14    14     f
Run Code Online (Sandbox Code Playgroud)

而且我想只选择那些因子水平test2出现超过三次的值,那么最快的方法是什么?

非常感谢,在之前的问题中没有找到正确的答案.

r

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