我比较熟悉data.table
,而不是那么熟悉dplyr
.我已经阅读了一些出现在SO上的dplyr
小插曲和例子,到目前为止我的结论是:
data.table
并且dplyr
在速度上具有可比性,除非有许多(即> 10-100K)组,并且在某些其他情况下(参见下面的基准)dplyr
有更多可访问的语法dplyr
摘要(或将)潜在的DB交互在我看来2.没有多大的重量,因为我对它很熟悉data.table
,虽然我明白对于那些对这两者都不熟悉的用户来说这将是一个很重要的因素.我想避免争论哪个更直观,因为这与我从已经熟悉的人的角度提出的具体问题无关data.table
.我还想避免讨论"更直观"如何导致更快的分析(当然是真的,但同样,不是我最感兴趣的).
我想知道的是:
最近的一个问题让我更多地思考这个问题,因为直到那时我才认为dplyr
会提供超出我已经做过的东西data.table
.这是dplyr
解决方案(Q末尾的数据):
dat %.%
group_by(name, job) %.%
filter(job != "Boss" | year == min(year)) %.%
mutate(cumu_job2 = cumsum(job2))
Run Code Online (Sandbox Code Playgroud)
这比我的黑客尝试data.table
解决方案要好得多.也就是说,好的data.table
解决方案也相当不错(感谢Jean-Robert,Arun,并注意到这里我赞成对最严格的最佳解决方案的单一陈述):
setDT(dat)[,
.SD[job != "Boss" | year == min(year)][, cumjob := cumsum(job2)],
by=list(id, job)
]
Run Code Online (Sandbox Code Playgroud)
后者的语法可能看起来非常深奥,但如果你习惯了data.table
(即不使用一些更深奥的技巧),它实际上非常简单.
理想情况下,我希望看到的是一些很好的例子,dplyr …
我有一个数据帧DF.
说DF是:
A B
1 1 2
2 1 3
3 2 3
4 3 5
5 3 6
Run Code Online (Sandbox Code Playgroud)
现在我想通过列A将行组合在一起并得到列B的总和.
例如:
A B
1 1 5
2 2 3
3 3 11
Run Code Online (Sandbox Code Playgroud)
我目前正在使用sqldf函数的SQL查询.但由于某种原因,它非常缓慢.有没有更方便的方法呢?我也可以使用for循环手动完成,但它又慢了.我的SQL查询是"从A组中选择A,计数(B)".
通常,每当我不使用矢量化操作并使用for循环时,即使对于单个过程,性能也非常慢.
df <- structure(list(`a a` = 1:3, `a b` = 2:4), .Names = c("a a", "a b"
), row.names = c(NA, -3L), class = "data.frame")
Run Code Online (Sandbox Code Playgroud)
和数据看起来像
a a a b
1 1 2
2 2 3
3 3 4
Run Code Online (Sandbox Code Playgroud)
跟随电话选择
select(df, 'a a')
Run Code Online (Sandbox Code Playgroud)
给
Error in abs(ind[ind < 0]) :
non-numeric argument to mathematical function
Run Code Online (Sandbox Code Playgroud)
如何选择"a a"和/或将其重命名为无空间使用select
?我知道以下方法:
names(df)[1] <- "a"
select(df, a=1)
select(df, ends_with("a"))
但是,如果我正在处理大型数据集,如何在不知道索引数字或类似列名的情况下获得完全匹配?
我有一个关系数据集,我正在寻找二元信息.
我有4列.发件人,接收者,属性,边缘
我想要重复发送者 - 接收者计数并将它们转换为额外的边缘.
df <- data.frame(sender = c(1,1,1,1,3,5), receiver = c(1,2,2,2,4,5),
attribute = c(12,12,12,12,13,13), edge = c(0,1,1,1,1,0))
sender receiver attribute edge
1 1 1 12 0
2 1 2 12 1
3 1 2 12 1
4 1 2 12 1
5 3 4 13 1
Run Code Online (Sandbox Code Playgroud)
我希望最终结果如下所示:
sender receiver attribute edge
1 1 1 12 0
2 1 2 12 3
3 3 4 13 1
Run Code Online (Sandbox Code Playgroud)
重复的发送者 - 接收者之间的关系已被组合,并且重复数量包含在边数中.
任何意见都会非常感激.
谢谢!
一周前,我会手动完成此操作:按组分组数据到新数据帧.对于每个数据帧计算意味着每个变量,然后是rbind.非常笨重......
现在,我已经了解split
和plyr
,我想必须有使用这些工具的更简单的方法.请不要证明我错了.
test_data <- data.frame(cbind(
var0 = rnorm(100),
var1 = rnorm(100,1),
var2 = rnorm(100,2),
var3 = rnorm(100,3),
var4 = rnorm(100,4),
group = sample(letters[1:10],100,replace=T),
year = sample(c(2007,2009),100, replace=T)))
test_data$var1 <- as.numeric(as.character(test_data$var1))
test_data$var2 <- as.numeric(as.character(test_data$var2))
test_data$var3 <- as.numeric(as.character(test_data$var3))
test_data$var4 <- as.numeric(as.character(test_data$var4))
Run Code Online (Sandbox Code Playgroud)
我和两个人都在玩,ddply
但是我无法生产出我想要的东西 - 即每个小组都有这样一张桌子
group a |2007|2009|
________|____|____|
var1 | xx | xx |
var2 | xx | xx |
etc. | etc| ect|
Run Code Online (Sandbox Code Playgroud)
也许d_ply
有些odfweave
输出会起作用.非常感谢投入.
ps我注意到data.frame将rnorm转换为data.frame中的因子?我怎么能避免这种情况 - 我(rnorm(100)不起作用所以我必须像上面那样转换成数字
这是我的问题:
df1 <- data.frame(x = 1:5, y = 2:6, z = 3:7)
rownames(df1) <- LETTERS[1:5]
df1
x y z
A 1 2 3
B 2 3 4
C 3 4 5
D 4 5 6
E 5 6 7
df2 <- data.frame(x = 1:5, y = 2:6, z = 3:7)
rownames(df2) <- LETTERS[3:7]
df2
x y z
C 1 2 3
D 2 3 4
E 3 4 5
F 4 5 6
G 5 6 7
Run Code Online (Sandbox Code Playgroud)
我想要的是:
x y …
Run Code Online (Sandbox Code Playgroud) 假设我在R表中有数据,如下所示:
Id Name Price sales Profit Month Category Mode
1 A 2 5 8 1 X K
1 A 2 6 9 2 X K
1 A 2 5 8 3 X K
1 B 2 4 6 1 Y L
1 B 2 3 4 2 Y L
1 B 2 5 7 3 Y L
2 C 2 5 11 1 X M
2 C 2 5 11 2 X L
2 C 2 5 11 3 X …
Run Code Online (Sandbox Code Playgroud) 我有一个看起来像这样的数据集:
Type Age count1 count2 Year Pop1 Pop2 TypeDescrip
A 35 1 1 1990 30000 50000 alpha
A 35 3 1 1990 30000 50000 alpha
A 45 2 3 1990 20000 70000 alpha
B 45 2 1 1990 20000 70000 beta
B 45 4 5 1990 20000 70000 beta
Run Code Online (Sandbox Code Playgroud)
我想添加在Type和Age列中匹配的行的计数.理想情况下,我最终会得到一个如下所示的数据集:
Type Age count1 count2 Year Pop1 Pop2 TypeDescrip
A 35 4 2 1990 30000 50000 alpha
A 45 2 3 1990 20000 70000 alpha
B 45 6 6 1990 20000 …
Run Code Online (Sandbox Code Playgroud) 我在 R 中有一个数据框,通常采用这种形式:
ID Year Amount
3 2000 45
3 2000 55
3 2002 10
3 2002 10
3 2004 30
4 2000 25
4 2002 40
4 2002 15
4 2004 45
4 2004 50
Run Code Online (Sandbox Code Playgroud)
我想按 ID 对每年的金额求和,并使用此输出获取新的数据框。
ID Year Amount
3 2000 100
3 2002 20
3 2004 30
4 2000 25
4 2002 55
4 2004 95
Run Code Online (Sandbox Code Playgroud)
这是我需要做的一个例子,实际上数据要大得多。请帮忙,谢谢!
我在 R 中有一个简单的整数向量。我想在向量中随机选择n 个位置并在向量中“合并”它们(即总和)。此过程可能发生多次,即在 100 个向量中,可能会发生 5 个合并/求和事件,每个事件中分别合并 2、3、2、4 和 2 个向量位置。例如:
#An example original vector of length 10:
ex.have<-c(1,1,30,16,2,2,2,1,1,9)
#For simplicity assume some process randomly combines the
#first two [1,1] and last three [1,1,9] positions in the vector.
ex.want<-c(2,30,16,2,2,2,11)
#Here, there were two merging events of 2 and 3 vector positions, respectively
#EDIT: the merged positions do not need to be consecutive.
#They could be randomly selected from any position.
Run Code Online (Sandbox Code Playgroud)
但此外,我还需要记录“合并”了多少个向量位置(如果向量中的位置未合并,则包括值 1)——将它们称为索引。由于前两个合并后三个合并在上面的示例中,索引数据将如下所示:
ex.indices<-c(2,1,1,1,1,1,3)
Run Code Online (Sandbox Code Playgroud)
最后,我需要把它全部放在一个矩阵中,所以上面例子中的最终数据将是一个 2 列矩阵,其中一列是整数,另一列是索引:
ex.final<-matrix(c(2,30,16,2,2,2,11,2,1,1,1,1,1,3),ncol=2,nrow=7) …
Run Code Online (Sandbox Code Playgroud)