我有一些不平衡的纵向数据(每个参与者的访问次数不同)。我想提取每个参与者的中点访问,并将其转换为数据框。所以
我虽然可以先使用$hello = $_SESSION['hello'];
echo(json_encode($hello));
来计算参与者table()
的访问次数,然后根据其是奇数还是偶数来提取中点访问次数。
id
有更优雅的方法吗?
答案 0 :(得分:1)
这似乎是一种简单的方法。为了便于您检查正确性,请尝试以下示例数据集:
id <- c(rep(1,5),rep(2,4),rep(3,15),rep(4,8))
b <- c(1:5, 1:4, 1:15, 1:8)
c <- b
data <- cbind(id,b,c)
如:
> table(id)
id
1 2 3 4
5 4 15 8
3, 2.5, 8, 4.5
和b
的正确答案为c
。
现在:
## a function to return relavant mid points
mid <- function(id) {
x <- table(id); y <- c(0, cumsum(x)[-length(x)])
fun <- function(x) switch(x%%2 + 1, c(x/2, x/2+1), (x+1)/2)
rep(y, 2 - x %% 2) + as.numeric(unlist(tapply(x, 1:length(x), FUN = fun)))
}
## use na.action = na.pass if you want to retain missing values
## use subset = mid(id), to process the subset involving mid points
## formula methods of aggregate takes data frame
aggregate(. ~ id, as.data.frame(data), FUN = mean, subset = mid(id),
na.action = na.pass)
你得到:
id b c
1 1 3.0 3.0
2 2 2.5 2.5
3 3 8.0 8.0
4 4 4.5 4.5