【问题标题】:How to operate two variables with one factor in R [duplicate]如何在R中用一个因子操作两个变量[重复]
【发布时间】:2018-10-19 19:44:20
【问题描述】:

我试图这样做:(以下数据框只是为了展示这个想法)

      a     b     c

[1,]  1     1     2

[2,]  1     3     5

[3,]  2     2     4

[4,]  2     1     5

其中“a”是将“b”和“c”分为两类的因素。我想得到 a 的加权平均值(b 作为权重,或者实际上是 b/Sum(b) 作为权重)。我找不到一个函数可以操作多个具有相同因子的变量。

在这个例子中,我想得到两种方法:

a组=1:(1*2+3*5)/(2+5)=17/7

a组=2:(2*4+1*5)/(4+5)=13/9

我是 R 新手,所以这对我来说真的很难处理。希望你们能抽出几秒钟的时间发表评论。非常感谢!

【问题讨论】:

  • Mean by Group R-FAQ 中选择您最喜欢的答案,并使用weighted.mean 而不是mean
  • 谢谢!刚看到评论,我会试着理解那些代码! (我认为是因为我搜索了sth.else而不是一开始的“mean”,我没有看到你粘贴的页面。
  • 术语“用一个因素操作两个变量”对我来说没有意义。我认为您的意思是“group_by/split on levels of a factor”。标记为group-by

标签: r group-by r-factor


【解决方案1】:

我们可以将matrix(基于显示的结构)转换为data.frame,按'a'分组,summarise通过取'b','c'乘积的sum,除以通过'c'的sum

library(dplyr)
m1 %>%
   as.data.frame %>% # if it is a matrix
   group_by(a) %>%
   summarise(new = sum(b*c)/sum(c))
# A tibble: 2 x 2
#       a   new
#   <int> <dbl>
#1     1  2.43
#2     2  1.44

数据

m1 <- structure(c(1L, 1L, 2L, 2L, 1L, 3L, 2L, 1L, 2L, 5L, 4L, 5L), .Dim = c(4L, 
3L), .Dimnames = list(NULL, c("a", "b", "c")))

【讨论】:

  • 感谢您的耐心等待!我运行了代码,它确实给出了类似的输出(在我的例子中,A tibble:109 x 2)。但是,“新”列都是相同的值。我不知道我在哪里做错了......如果“本地”已经是一个数据框,我可以这样做:local%&gt;%group_by(local$bond)%&gt;%summarize(new=crossprod(local$gross,local$latestytm)/sum(local$gross))?现在它起作用了!太感谢了!我太粗心了。这真的很有帮助。
  • @JustCallMeGary 也许你也加载了plyr 来掩盖summarise。您可以明确使用%&gt;% dplyr::summarise(new = sum(..。在group_by 中,它应该是group_by(bond) 而不是group_by(local$bond)(如果你检查我的语法),即列名而不是列值
  • weighted.mean(x = b, w = c)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-09
  • 2018-11-24
  • 1970-01-01
相关资源
最近更新 更多