R 计算频率和从长到宽转换的更快方法
我试图获得两个变量“周”和“id”的水平组合的计数。我希望结果以“id”作为行,“week”作为列,计数作为值 到目前为止我已经尝试过的示例(尝试了一系列其他事情,包括添加一个虚拟变量=1,然后在此基础上添加R 计算频率和从长到宽转换的更快方法,r,aggregate,plyr,reshape2,R,Aggregate,Plyr,Reshape2,我试图获得两个变量“周”和“id”的水平组合的计数。我希望结果以“id”作为行,“week”作为列,计数作为值 到目前为止我已经尝试过的示例(尝试了一系列其他事情,包括添加一个虚拟变量=1,然后在此基础上添加fun.aggregate=sum): 但是,我一定是做错了什么,因为这个函数没有完成。有更好的方法吗 输入: id week 1 1 1 2 1 3 1 1 2 3 输出: 1 2 3 1 2 1 1 2
fun.aggregate=sum
):
但是,我一定是做错了什么,因为这个函数没有完成。有更好的方法吗
输入:
id week
1 1
1 2
1 3
1 1
2 3
输出:
1 2 3
1 2 1 1
2 0 0 1
对此,您不需要
ddply
。来自重塑2的dcast
已足够:
dat <- data.frame(
id = c(rep(1, 4), 2),
week = c(1:3, 1, 3)
)
library(reshape2)
dcast(dat, id~week, fun.aggregate=length)
id 1 2 3
1 1 2 1 1
2 2 0 0 1
您可以只使用
表
命令:
table(data$id,data$week)
1 2 3
1 2 1 1
2 0 0 1
如果“id”和“week”是数据框中唯一的列,您可以简单地使用:
table(data)
# week
# id 1 2 3
# 1 2 1 1
# 2 0 0 1
library(data.table)
dcast(setDT(data), id ~ week)
# Using 'week' as value column. Use 'value.var' to override
# Aggregate function missing, defaulting to 'length'
# id 1 2 3
# 1: 1 2 1 1
# 2: 2 0 0 1
ddply
花费如此长时间的原因是,按组进行的拆分不是并行运行的(只有“拆分”上的计算),因此对于大量的组来说,它将是缓慢的(并且.parallel=T
)将没有帮助
使用data.table::dcast
(data.table
version>=1.9.2)的方法在时间和内存方面应该非常高效。在这种情况下,我们可以依赖默认参数值,只需使用:
table(data)
# week
# id 1 2 3
# 1 2 1 1
# 2 0 0 1
library(data.table)
dcast(setDT(data), id ~ week)
# Using 'week' as value column. Use 'value.var' to override
# Aggregate function missing, defaulting to 'length'
# id 1 2 3
# 1: 1 2 1 1
# 2: 2 0 0 1
或者显式设置参数:
dcast(setDT(data), id ~ week, value.var = "week", fun = length)
# id 1 2 3
# 1: 1 2 1 1
# 2: 2 0 0 1
有关pre-
数据。表
1.9.2备选方案,请参见编辑。Atidyverse
选项可以是:
library(dplyr)
library(tidyr)
df %>%
count(id, week) %>%
pivot_wider(names_from = week, values_from = n, values_fill = list(n = 0))
#spread(week, n, fill = 0) #In older version of tidyr
# id `1` `2` `3`
# <dbl> <dbl> <dbl> <dbl>
#1 1 2 1 1
#2 2 0 0 1
数据
df <- structure(list(id = c(1L, 1L, 1L, 1L, 2L), week = c(1L, 2L, 3L,
1L, 3L)), class = "data.frame", row.names = c(NA, -5L))
df+1爆炸。你有本事让我的解决方案看起来非常冗长、迂回和平淡。如果你有很多数据和操作无法简化,那么“data.table”包可能会帮助你。
df <- structure(list(id = c(1L, 1L, 1L, 1L, 2L), week = c(1L, 2L, 3L,
1L, 3L)), class = "data.frame", row.names = c(NA, -5L))