数据在R中变异

时间:2017-11-01 12:09:50

标签: r dplyr reshape2

我有一个这样的数据框:

Var1 Var2 value
x5   x1   2
x6   x1   6
x1   x2   2
x5   x2   2
x6   x2   4
x7   x2   3

我希望根据相应的Var2重新整理/汇总/汇总每对Var1的最小值,就像那样:

Var3 Var4 minvalue
x5   x6   2
x1   x5   2
x1   x6   2
x1   x7   2
x5   x6   2
x5   x7   2
x6   x7   3

如果您将Var1值与相应的Var2值组合,请选择最小值。 E.g x1 Var2x5x6连接为Var1,值为min(x5,x6)= 2

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

根据说明,我们需要通过combn进行分组,以获得min'值'对#'。 ' Var2' base R选项将split。然后执行combn on' Var1',获取min的'值'通过为每个' Var1'

分配相应的值
res <- do.call(rbind, lapply(split(df1[-2], df1$Var2), function(x) {
       x1 <- combn(x$Var1, 2, FUN = list)
      data.frame(do.call(rbind, x1),minvalue = sapply(x1, function(y) 
                 min(x$value[x$Var1 %in% y]))) }))
row.names(res) <- NULL
res
#  X1 X2 minvalue
#1 x5 x6        2
#2 x1 x5        2
#3 x1 x6        2
#4 x1 x7        2
#5 x5 x6        2
#6 x5 x7        2
#7 x6 x7        3

或者我们可以使用data.table,按照&#39; Var2&#39;进行分类,combn如前所述

library(data.table)
setDT(df1)[, {
         x1 <- combn(Var1, 2, FUN = list)
         data.frame(do.call(rbind, x1), 
              minvalue = sapply(x1, function(y) min(value[Var1 %in% y])),
             stringsAsFactors= FALSE)
           }, by = Var2]

数据

df1 <- structure(list(Var1 = c("x5", "x6", "x1", "x5", "x6", "x7"), 
Var2 = c("x1", "x1", "x2", "x2", "x2", "x2"), value = c(2L, 
6L, 2L, 2L, 4L, 3L)), .Names = c("Var1", "Var2", "value"),
class = "data.frame", row.names = c(NA, -6L))

答案 1 :(得分:1)

使用data.table's 非等联接的替代解决方案:

library(data.table)
setDT(df1)[, rn := .I][
  df1, on = .(Var2, rn < rn), nomatch = 0L, allow = TRUE,
  .(Var3 = Var1, Var4 = i.Var1, minvalue = pmin(value, i.value))]
   Var3 Var4 minvalue
1:   x5   x6        2
2:   x1   x5        2
3:   x1   x6        2
4:   x5   x6        2
5:   x1   x7        2
6:   x5   x7        2
7:   x6   x7        3

Var2上的加入相当于按Var2分组,而行号上的加入条件rn < rn取代combn()

我想知道如果应用于更大的数据集,此代码在速度方面与akrun's solutions的比较。