相关疑难解决方法(0)

data.table vs dplyr:一个人能做得好吗,另一个做不好或做得不好?

概观

我比较熟悉data.table,而不是那么熟悉dplyr.我已经阅读了一些出现在SO上的dplyr小插曲和例子,到目前为止我的结论是:

  1. data.table并且dplyr在速度上具有可比性,除非有许多(即> 10-100K)组,并且在某些其他情况下(参见下面的基准)
  2. dplyr 有更多可访问的语法
  3. dplyr 摘要(或将)潜在的DB交互
  4. 有一些小的功能差异(参见下面的"示例/用法")

在我看来2.没有多大的重量,因为我对它很熟悉data.table,虽然我明白对于那些对这两者都不熟悉的用户来说这将是一个很重要的因素.我想避免争论哪个更直观,因为这与我从已经熟悉的人的角度提出的具体问题无关data.table.我还想避免讨论"更直观"如何导致更快的分析(当然是真的,但同样,不是我最感兴趣的).

我想知道的是:

  1. 对于熟悉软件包的人来说,是否需要使用一个或另一个软件包来编写分析任务更加容易(例如,需要按键的一些组合与所需的深奥水平相结合,其中每个项目的好处都是好事).
  2. 是否存在在一个包装与另一个包装中更有效地执行分析任务(即,超过2倍)的分析任务.

最近的一个问题让我更多地思考这个问题,因为直到那时我才认为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 …

r dplyr data.table

719
推荐指数
4
解决办法
11万
查看次数

data.frame Group By列

我有一个数据帧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循环时,即使对于单个过程,性能也非常慢.

aggregate r

60
推荐指数
3
解决办法
16万
查看次数

dplyr:选择包含空格的列名

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?我知道以下方法:

  1. names(df)[1] <- "a"
  2. select(df, a=1)
  3. select(df, ends_with("a"))

但是,如果我正在处理大型数据集,如何在不知道索引数字或类似列名的情况下获得完全匹配?

r dataframe dplyr

47
推荐指数
1
解决办法
3万
查看次数

合并数据框内的行

我有一个关系数据集,我正在寻找二元信息.

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

重复的发送者 - 接收者之间的关系已被组合,并且重复数量包含在边数中.

任何意见都会非常感激.

谢谢!

r plyr data.table

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

对于每个组,汇总数据框中所有变量的均值(ddply?split?)

一周前,我会手动完成此操作:按组分组数据到新数据帧.对于每个数据帧计算意味着每个变量,然后是rbind.非常笨重......

现在,我已经了解splitplyr,我想必须有使用这些工具的更简单的方法.请不要证明我错了.

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)不起作用所以我必须像上面那样转换成数字

r plyr dataframe

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

如何合并和求和两个数据帧

这是我的问题:

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

10
推荐指数
2
解决办法
9140
查看次数

R表函数:如何求和而不是计数?

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

aggregate r

9
推荐指数
1
解决办法
2万
查看次数

计算两个分组变量的每个组合的列总和

我有一个看起来像这样的数据集:

 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)

aggregate r

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

R 将一个变量按两组求和

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

这是我需要做的一个例子,实际上数据要大得多。请帮忙,谢谢!

aggregate r dplyr

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

组合/求和 R 中整数向量中的两个位置

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

r vector

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

标签 统计

r ×10

aggregate ×4

dplyr ×3

data.table ×2

dataframe ×2

plyr ×2

vector ×1