R 中的数据摘要:使用 count() 并查找平均值
Data Summary in R: Using count() and finding an average numeric value
我正在研究有向图,需要一些关于生成特定边属性的建议。
我需要在我的可视化中同时使用交互计数和交互的另一种质量(同一唯一 from/to 对之间交互中使用的文本的平均长度)。
我正在努力弄清楚如何以干净、可扩展的方式创建此输出。以下是我当前的输入、解决方案和输出。我还包括了一个理想的输出以及我尝试过的一些东西。
输入
x = read.table(network = "
Actor Receiver Length
1 1 4
1 2 20
1 3 9
1 3 100
1 3 15
2 3 38
3 1 25
3 1 17"
sep = "", header = TRUE)
我目前正在使用 dplyr 计算每对出现多少次以实现下面的输出。
我使用以下命令:
EDGE <- dplyr::count(network, Actor, Receiver )
names(EDGE) <- c("from","to","count")
实现我目前的输出:
From To Count
1 1 1
1 2 1
1 3 3
2 3 1
3 1 2
然而,理想情况下,我也想知道每对的平均长度,或者最终得到这样的结果:
From To Count AverageLength
1 1 1 4
1 2 1 20
1 3 3 41
2 3 1 38
3 1 2 21
有什么方法可以在不创建大量新数据帧然后将它们移植回输出的情况下做到这一点?我主要在尝试同时总结和计数时遇到问题。我愚蠢的解决方案是简单地添加 "Length" 作为计数函数的参数,这不会产生任何有用的东西。我还可以认为,结合参与者-接收者然后使用摘要函数创建一些东西以作为计数结果移植到框架上可能很有用。然而,为了扩展的利益,我想弄清楚是否有一种简单明了的方法来做到这一点。
非常感谢您对此问题的帮助。
一个天真的解决方案是使用 cbind()
将这两个输出连接在一起。这是一个示例代码:
Actor <- c(rep(1, 5), 2, 3, 3)
Receiver <- c(1, 2, rep(3, 4), 1, 1)
Length <- c(4, 20, 9, 100, 15, 38, 25, 17)
x <- data.frame("Actor" = Actor,
"Receiver" = Receiver,
"Length" = Length)
library(plyr)
EDGE <- cbind(ddply(x,.(Actor, Receiver), nrow), # This part replace dplyr::count
ddply(x,.(Actor, Receiver), summarize, mean(Length))[ , 3]) # This is the summarize
names(EDGE) <- c("From", "To", "Count", "AverageLength")
EDGE # Gives the expected results
From To Count AverageLength
1 1 1 1 4.00000
2 1 2 1 20.00000
3 1 3 3 41.33333
4 2 3 1 38.00000
5 3 1 2 21.00000
我正在研究有向图,需要一些关于生成特定边属性的建议。
我需要在我的可视化中同时使用交互计数和交互的另一种质量(同一唯一 from/to 对之间交互中使用的文本的平均长度)。
我正在努力弄清楚如何以干净、可扩展的方式创建此输出。以下是我当前的输入、解决方案和输出。我还包括了一个理想的输出以及我尝试过的一些东西。
输入
x = read.table(network = "
Actor Receiver Length
1 1 4
1 2 20
1 3 9
1 3 100
1 3 15
2 3 38
3 1 25
3 1 17"
sep = "", header = TRUE)
我目前正在使用 dplyr 计算每对出现多少次以实现下面的输出。
我使用以下命令:
EDGE <- dplyr::count(network, Actor, Receiver )
names(EDGE) <- c("from","to","count")
实现我目前的输出:
From To Count
1 1 1
1 2 1
1 3 3
2 3 1
3 1 2
然而,理想情况下,我也想知道每对的平均长度,或者最终得到这样的结果:
From To Count AverageLength
1 1 1 4
1 2 1 20
1 3 3 41
2 3 1 38
3 1 2 21
有什么方法可以在不创建大量新数据帧然后将它们移植回输出的情况下做到这一点?我主要在尝试同时总结和计数时遇到问题。我愚蠢的解决方案是简单地添加 "Length" 作为计数函数的参数,这不会产生任何有用的东西。我还可以认为,结合参与者-接收者然后使用摘要函数创建一些东西以作为计数结果移植到框架上可能很有用。然而,为了扩展的利益,我想弄清楚是否有一种简单明了的方法来做到这一点。
非常感谢您对此问题的帮助。
一个天真的解决方案是使用 cbind()
将这两个输出连接在一起。这是一个示例代码:
Actor <- c(rep(1, 5), 2, 3, 3)
Receiver <- c(1, 2, rep(3, 4), 1, 1)
Length <- c(4, 20, 9, 100, 15, 38, 25, 17)
x <- data.frame("Actor" = Actor,
"Receiver" = Receiver,
"Length" = Length)
library(plyr)
EDGE <- cbind(ddply(x,.(Actor, Receiver), nrow), # This part replace dplyr::count
ddply(x,.(Actor, Receiver), summarize, mean(Length))[ , 3]) # This is the summarize
names(EDGE) <- c("From", "To", "Count", "AverageLength")
EDGE # Gives the expected results
From To Count AverageLength
1 1 1 1 4.00000
2 1 2 1 20.00000
3 1 3 3 41.33333
4 2 3 1 38.00000
5 3 1 2 21.00000