【问题标题】:When using the function By in R, how do I create a vector of the factors for each group?在 R 中使用函数 By 时,如何为每个组创建一个因子向量?
【发布时间】:2018-11-21 23:26:17
【问题描述】:

我在 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

谢谢

【问题讨论】:

  • 您尝试的矩阵乘法输出%*% 与可以使用aggregate() 完成的预期输出不一致。请指教。
  • 对不起。我已经更新了代码。它应该除以我遗漏的一列的总和。

标签: r subset tapply


【解决方案1】:

考虑在您的 by 调用中返回一个数据框,而不是单值向量,在该向量中您的计算被呈现为一个新列并且 xy 列被删除全部使用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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-02-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-14
    • 2021-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多