使用dplyr的网络中的净变化 背景:

使用dplyr的网络中的净变化 背景:,r,dplyr,R,Dplyr,我在一个市场上有几种产品,客户往往会在这些产品之间切换。我需要计算在两种产品之间切换的客户的净收益/损失,以便在visNetwork图中显示动态 数据: 我的数据集的一个片段: > dput(df) structure(list(value = c(2.5, 5, 20, 113, 25, 43.5, 25.5, 2.5, 5, 22.5, 17.5, 32, 65, 7.5, 10, 45.5, 12.5, 10, 5, 37, 35, 20.5, 10, 5, 7.5), sour

我在一个市场上有几种产品,客户往往会在这些产品之间切换。我需要计算在两种产品之间切换的客户的净收益/损失,以便在visNetwork图中显示动态

数据: 我的数据集的一个片段:

> dput(df)
structure(list(value = c(2.5, 5, 20, 113, 25, 43.5, 25.5, 2.5, 
5, 22.5, 17.5, 32, 65, 7.5, 10, 45.5, 12.5, 10, 5, 37, 35, 20.5, 
10, 5, 7.5), source = structure(c(1L, 1L, 2L, 2L, 2L, 2L, 2L, 
2L, 3L, 3L, 3L, 3L, 3L, 3L, 4L, 4L, 4L, 4L, 4L, 5L, 5L, 5L, 5L, 
6L, 6L), .Label = c("A", "B", "C", "D", "E", "F"), class = "factor"), 
    target = structure(c(2L, 3L, 1L, 3L, 4L, 5L, 6L, 7L, 1L, 
    2L, 4L, 5L, 6L, 7L, 2L, 3L, 5L, 6L, 7L, 2L, 3L, 4L, 6L, 3L, 
    5L), .Label = c("A", "B", "C", "D", "E", "F", "G"), class = "factor")), .Names = c("value", 
"source", "target"), row.names = c(NA, -25L), class = "data.frame")

> head(df,10)
   value source target
1    2.5      A      B
2    5.0      A      C
3   20.0      B      A
4  113.0      B      C
5   25.0      B      D
6   43.5      B      E
7   25.5      B      F
8    2.5      B      G
9    5.0      C      A
10  22.5      C      B
请注意,并非所有产品都会失去/赢得客户

问题: 在上述数据集中,产品A对产品B损失2.5个客户,产品B对产品A损失20个客户。那么,产品A的净收益为17.5个客户,产品B的净损失为2.5个客户。我想对使用dplyr的所有产品进行此计算,因为我在分析的其他部分中大量使用了dplyr

生成的数据帧可以具有以下结构:

  from to value
1    B  A  17.5

请忽略我有一半客户的事实:)

它不会使用
dplyr
,但您可以使用
acast
创建一个矩阵并从另一个三角形中减去一个三角形

library("reshape2")

df.mat <- acast(df, source ~ target)
df.mat.u <- df.mat[upper.tri(df.mat)]
df.mat.l <- df.mat[lower.tri(df.mat)]

df.mat.l - df.mat.u
库(“重塑2”)
df.mat使用dplyr:

mutate(data,new_value=apply(data,1,function(vec){ max(data[data$source==vec[3] & data$target==vec[2],"value"],0)})-value)
使用数据表:

setDT(data)
data[,new_value:=apply(data,1,function(vec){ max(data[data$source==vec[3] & data$target==vec[2]]$value,0)})-value]
如果要删除以前的值并获得最终结果:

mutate(data,value=apply(data,1,function(vec){ max(data[data$source==vec[3] & data$target==vec[2],"value"],0)})-value)[,c(3,2,1)]

你能展示你的代码吗?你对我代码的哪一部分感兴趣?除了上面的数据框架,我没有什么其他的建议。最后的建议正是我想要的-谢谢!不过,我需要花一些时间来弄清楚它到底为什么有效:)很高兴听到这个消息。它的工作方式如下:对于每一行,它获取源和目标,并从相反的行中获取值:因此第一行S:“A”T:“B”,它搜索带有T:“A”和S:“B”的行,并获取值。我把最大值(,0)放进去,这样如果找不到组合,它将返回0(例如S:“F”T:“B”不存在),然后我减去原始值。我希望这是清楚的:)