【发布时间】:2015-07-22 05:15:43
【问题描述】:
说我有这个data.frame,data:
data <- data.frame(val=c(rep(6,10), rep(7, 15), rep(8, 20), rep(9, 25), rep(10, 100), rep(11, 20), rep(12, 15), rep(13, 10)))
data$plus <- data$val + 100
我的目标是创建一个新的data.frame,其中包含每个val 的频率以及相关的plus 值。
我目前的策略是创建一个表(称为table),然后合并频率。然后只保留每组中的第一个观察结果:
table <- table(data$val)
df1 <- data.frame(val = as.integer(names(table)[1:length(table)]), N = table[1:length(table)])
df2 <- merge(data, df1)
df3 <- do.call(rbind, by(df2, list(df2$val), FUN=function(x) head(x, 1)))
这可行,但看起来很笨重。
例如,在 Stata 中,它会是更少更简单的代码。比如:
bys val plus: egen max = _N
bys val plus: gen first = _n==1
keep if first==1
有没有办法简化或使 R 代码更优雅?
【问题讨论】:
标签: r merge data.table aggregate