使用dplyr的网络中的净变化 背景:
我在一个市场上有几种产品,客户往往会在这些产品之间切换。我需要计算在两种产品之间切换的客户的净收益/损失,以便在visNetwork图中显示动态 数据: 我的数据集的一个片段:使用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
> 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”不存在),然后我减去原始值。我希望这是清楚的:)