小编edd*_*ddi的帖子

data.table和表意外行为

数据来自我正在玩的另一个问题:

dt <- data.table(user=c(rep(3, 5), rep(4, 5)),
                 country=c(rep(1,4),rep(2,6)),
                 event=1:10, key="user")
#    user country event
#1:     3       1     1
#2:     3       1     2
#3:     3       1     3
#4:     3       1     4
#5:     3       2     5
#6:     4       2     6
#7:     4       2     7
#8:     4       2     8
#9:     4       2     9
#10:    4       2    10
Run Code Online (Sandbox Code Playgroud)

这是令人惊讶的行为:

dt[user == 3, as.data.frame(table(country))]
#  country Freq
#1       1    4
#2       2    1

dt[user == 4, as.data.frame(table(country))]
#  country Freq
#1       2    5

dt[, as.data.frame(table(country)), …
Run Code Online (Sandbox Code Playgroud)

r data.table

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

R中的循环简单,在R中生成"替换长度为零"

我是R的新手,所以在C和Python中似乎工作正常,令人惊讶地在R中分解.我正在尝试计算前1000个Fibonacci数的乘积.这是完整的代码:

#PRRODUCT OF FIBONACCI NUMBERS
Fibonacci<-rep(0, 1000)
Fibonacci[0]<-1
Fibonacci[1]<-1
Product<-1

for (i in 2:1000)
{
    Fibonacci[i]<-(Fibonacci[i-1])+(Fibonacci[i-2])
    Product<-Fibonacci[i]*Product
}

Fibonacci[1000]
Product
Run Code Online (Sandbox Code Playgroud)

这将返回以下错误:

Error in Fibonacci[i] <- (Fibonacci[X - 1]) + (Fibonacci[X - 2]) : 
  replacement has length zero
Run Code Online (Sandbox Code Playgroud)

我倾向于认为我误解了使用数组的不同元素进行操作(可能是矢量描述中的i-2不正确),但我在过去的一个半小时内没有找到任何可以帮助我纠正的东西它.因此,任何对问题原因的见解都将受到最高的赞赏.

先感谢您.

for-loop r

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

如何在dplyr中变异而不会丢失顺序?

使用data.table我可以执行以下操作:

library(data.table)
dt = data.table(a = 1:2, b = c(1,2,NA,NA))
#   a  b
#1: 1  1
#2: 2  2
#3: 1 NA
#4: 2 NA

dt[, b := b[1], by = a]
#   a b
#1: 1 1
#2: 2 2
#3: 1 1
#4: 2 2
Run Code Online (Sandbox Code Playgroud)

dplyr然而,尝试相同的操作,数据被加扰/排序a:

library(dplyr)
dt = data.table(a = 1:2, b = c(1,2,NA,NA))
dt %.% group_by(a) %.% mutate(b = b[1])
#  a b
#1 1 1
#2 1 1
#3 2 …
Run Code Online (Sandbox Code Playgroud)

r dplyr data.table

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

为数据中的每一行构造一个标识符字符串

我有以下数据:

library(data.table)
d = data.table(a = c(1:3), b = c(2:4))
Run Code Online (Sandbox Code Playgroud)

并希望获得此结果(以适用于任意数量的列的方式):

d[, c := paste0('a_', a, '_b_', b)]
d
#   a b       c
#1: 1 2 a_1_b_2
#2: 2 3 a_2_b_3
#3: 3 4 a_3_b_4
Run Code Online (Sandbox Code Playgroud)

以下作品,但我希望能找到更短更清晰的东西.

d = data.table(a = c(1:3), b = c(2:4))
d[, c := apply(mapply(paste, names(.SD), .SD, MoreArgs = list(sep = "_")),
               1, paste, collapse = "_")]
Run Code Online (Sandbox Code Playgroud)

string r data.table

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

从字符串时间到毫秒的快速转换

对于向量或时间列表,我想从字符串时间开始,例如12:34:56.789从午夜到毫秒,这将等于45296789.

这就是我现在所做的:

toms = function(time) {
  sapply(strsplit(time, ':', fixed = T),
         function(x) sum(as.numeric(x)*c(3600000,60000,1000)))
}
Run Code Online (Sandbox Code Playgroud)

并希望更快地完成.

以下是基准测试的示例数据集:

times = rep('12:34:56.789', 1e6)

system.time(toms(times))
#   user  system elapsed 
#   9.00    0.04    9.05
Run Code Online (Sandbox Code Playgroud)

string r

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

我可以在单个dplyr语句中切换分组变量吗?

这是一个简单的例子来说明这个问题:

library(data.table)
dt = data.table(a = c(1,1,2,2), b = 1:2)

dt[, c := cumsum(a), by = b][, d := cumsum(a), by = c]
#   a b c d
#1: 1 1 1 1
#2: 1 2 1 2
#3: 2 1 3 2
#4: 2 2 3 4
Run Code Online (Sandbox Code Playgroud)

试图在dplyr我做同样的事情失败,因为第一个group_by是持久的,分组是由两个bc:

df = data.frame(a = c(1,1,2,2), b = 1:2)

df %.% group_by(b) %.% mutate(c = cumsum(a)) %.%
       group_by(c) %.% mutate(d = cumsum(a))
#  a …
Run Code Online (Sandbox Code Playgroud)

r dplyr data.table

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

为什么data.table,设置"with"= F,当j是单列时输出data.table?

假设我有数据表dt.

dt = as.data.table(c(0,1,2,3))
Run Code Online (Sandbox Code Playgroud)

我想知道为什么dt的行为在以下两行代码中有所不同.

dt[,V1]

dt[,"V1",with=F]
Run Code Online (Sandbox Code Playgroud)

具体来说,第一行产生数字向量,而第二行产生data.table.

我想构建一个函数,允许我通过传递一个字符串(因此使用= F)动态检索单个列,并在某些其他函数中使用该输出.就像现在一样,后一种情况下的行为可能会导致某些函数出错,例如ecdf和hist,它们不接受data.frame或data.table.

这是我做过的解决方法.

as.data.frame(dt[,"V1",with=F])[,1]
Run Code Online (Sandbox Code Playgroud)

这将返回预期的输出:一个与ecdf和hist很好地匹配的向量.这有点乱.这种行为有什么dt[,"V1",with=F]不同dt[,V1]

r data.table

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

在C/C++中使用eval和替换

我想在C/C++中复制以下R函数:

fn1 = function(a, b) eval(a, b)

fn1(substitute(a*2), list(a = 1))
#[1] 2
Run Code Online (Sandbox Code Playgroud)

我的第一次尝试导致错误(有时在崩溃中),可能是因为我没有从列表对象获取环境(我查看了R源代码,并且它使用了一堆内部函数)我不认为我可以使用的点,我认为这是Rf_eval想要的而不是对象本身.

require(Rcpp)
require(inline)

fn2 = cxxfunction(signature(x = "SEXP", y = "SEXP"),
                 'return Rf_eval(x, y);')

fn2(substitute(a*2), list(a = 1))
# error, object 'a' not found
Run Code Online (Sandbox Code Playgroud)

另一种尝试是尝试调用基数R eval,这也给出了同样的错误:

require(Rcpp)
require(inline)

fn3 = cxxfunction(signature(x = "SEXP", y = "SEXP"),
                 'Function base_eval("eval"); return base_eval(x, y);',
                 plugin = 'Rcpp')

fn3(substitute(a*2), list(a = 1))
# again, object 'a' not found
Run Code Online (Sandbox Code Playgroud)

每种方法都缺少什么,我怎样才能使它们都有效?

c r rcpp

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

如何在data.table R中的子组内订购数据

考虑以下:

DT = data.table(a=sample(1:2), b=sample(1:1000,20))

如何显示b,比如每个a 显示n个最高值?

我被困在了DT[,b,by=a][order(a,-b)].

谢谢!

r data.table

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

删除第一个重复行并保留其余行?

我想删除基于"用户"列的重复项,但只删除它出现的第一个实例.

DF:

User  No
A     1
B     1
A     2
A     3
A     4
C     1
B     2
D     1
Run Code Online (Sandbox Code Playgroud)

结果:(A1和B1删除)

User  No  
A     2
A     3
A     4
C     1
B     2
D     1
Run Code Online (Sandbox Code Playgroud)

我使用复制功能一直没有成功.

任何帮助,将不胜感激!谢谢!

r

5
推荐指数
3
解决办法
2319
查看次数

标签 统计

r ×10

data.table ×6

dplyr ×2

string ×2

c ×1

for-loop ×1

rcpp ×1