通常,我有一个包含数值变量和分类变量的数据框架,我希望根据分类变量拆分数值变量,执行一些操作,然后以数据框架的形式将其重新组合在一起。该操作依赖于类别中数值向量的整个部分,有时会返回不同长度的向量。我知道如何以一种丑陋的方式来做这件事(见下面的例子),但这似乎是一种常见的操作,所以我想知道是否有一种我不知道的更简单的方法。我特别想知道是否有使用tidyverse
的解决方案。
这是我所说的一个例子。
df = data.frame(y=1:10, g=rep(c("a", "b"), each=5))
假设我想标准化变量y
,使其在分类变量的每个级别上都在0到1之间。以下是完成此操作的一般方法:
do.call(
rbind,
lapply(unique(df$g),
function(level) {
y.current = df$y[df$g==level]
## perform some operation
y.new = (y.current-min(y.current))/
(max(y.current)-min(y.current))
return(data.frame(y=y.new,
g=level))
}
)
)
这需要大量的输入,而且可读性不是很好。有没有更好的方法?
编辑:感谢你的精彩回答。我唯一感兴趣的是使用tidyverse
实现这一点的完全通用的方法。如果我们将示例更改为数值向量的大小减小但大于1的操作,则group_by
/mutate
/summarize
组合将不起作用。例如,假设我想删除每个组中的最大值。我能做到
library(dplyr)
df = data.frame(y=1:10, g=rep(c("a", "b"), each=5))
trans_df = df %>%
group_by(g) %>%
do(y=.$y[-which.max(.$y)])
变换后的数据帧trans_df
具有每个级别具有一个观察值的分组变量,并且变换后的变量作为分组变量的每个级别的列表。我可以使用base R将其放入原始格式
data.frame(g=rep(trans_df$g, times=sapply(trans_df$y, length)),
y=do.call(c, trans_df$y))
但是我如何使用tidyverse
来完成这项工作呢
https://stackoverflow.com/questions/51163629
复制相似问题