在R中使用By函数时,如何为每个组创建因子向量?

时间:2018-11-21 23:26:17

标签: r subset tapply

我在R中使用函数“ by”,最后,我还希望在其中包含因子的向量,因为我想创建一个数据框,其中包含我所计算的内容以及紧随其后的因子用来细分该特定组的功能。如何从输出中提取因子?设置如下。

id <- rep(14:18,each=5)
x <- rep(5:9,each =5)
y <- rep(5:9, each = 5)
t <- data.frame(id = id,x=x,y=y)
s <- by(t,id,function(h){ (h$x%*%h$y)/sum(h$y)})

在最终输出中,我想要这样的东西。

sum id 
 5  14
 6  15
 7  16
 8  17
 9  18

谢谢

1 个答案:

答案 0 :(得分:1)

请考虑在您的by调用中返回数据框,而不是返回单值向量,在该单值向量中,您的计算将显示为新列以及 x y 列使用transform()删除所有元素,该函数用于操作列,然后返回调整后的数据帧。

然后,为避免重复数据(因为您正在运行聚合),请将结果包装在unique()中。最后,由于by将返回一个单行数据帧的列表,因此在外部运行do.call(rbind, ...)将所有元素行绑定在一起。

df_list <- by(t,id, function(sub)
                        unique(transform(sub, 
                                         sum_output = (x %*% y) / sum(y), 
                                         x = NULL, 
                                         y = NULL)
                        )
           )

final_df <- do.call(rbind, df_list)
row.names(final_df) <- NULL

final_df 

#   id sum
# 1 14   5
# 2 15   6
# 3 16   7
# 4 17   8
# 5 18   9