我有一个这样的数据框:
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
Var2
将x5
和x6
连接为Var1
,值为min(x5,x6)= 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的比较。