【问题标题】:estimate frequency for multiple subsets of data frame in R [duplicate]估计R中多个数据帧子集的频率[重复]
【发布时间】:2016-05-05 03:45:14
【问题描述】:

我有一个这样的数据框:

df<-data.frame(fac1=rep(c("a","b","c"),3),fac2=c(rep("x",3),rep("y",3),rep("z",3)),val=seq(10,90,10))

我想做的是计算给定 fac2 内每个 fac1 级别的频率。

我没有太多使用“for循环”,但我认为这样的事情会做到这一点:

df$freqs<-for(i in unique(df$fac2)) df$val/sum(df$val)

但是,当我这样做时,什么都不会返回。如果有人有任何想法,那就太好了。

【问题讨论】:

  • 你需要library(data.table);setDT(df)[,val/sum(val) , fac2]

标签: r for-loop subset


【解决方案1】:

我们可以使用data.table

library(data.table)
setDT(df)[, freq:= val/sum(val) , by = fac2]
df
#   fac1 fac2 val      freq
#1:    a    x  10 0.1666667
#2:    b    x  20 0.3333333
#3:    c    x  30 0.5000000
#4:    a    y  40 0.2666667
#5:    b    y  50 0.3333333
#6:    c    y  60 0.4000000
#7:    a    z  70 0.2916667
#8:    b    z  80 0.3333333
#9:    c    z  90 0.3750000

或使用base R

df$freq <- with(df, val/ave(val, fac2, FUN=sum))

【讨论】:

  • 谢谢@akrun。我不知道 data.table 库,但看起来很有用
【解决方案2】:

使用库dpyr,您可以尝试以下操作:

library(dplyr)
df %>%
  group_by(fac2) %>%
  mutate(freqs = val / sum(val))

Source: local data frame [9 x 4]
Groups: fac2 [3]

    fac1   fac2   val     freqs
  <fctr> <fctr> <dbl>     <dbl>
1      a      x    10 0.1666667
2      b      x    20 0.3333333
3      c      x    30 0.5000000
4      a      y    40 0.2666667
5      b      y    50 0.3333333
6      c      y    60 0.4000000
7      a      z    70 0.2916667
8      b      z    80 0.3333333
9      c      z    90 0.3750000

这是你想要的吗?

【讨论】:

  • 感谢@Gopala,这非常有用。只是要注意,运行此代码后,如果你想要一个数据框,你需要做df&lt;-as.data.frame(df)
猜你喜欢
  • 2021-10-07
  • 1970-01-01
  • 2013-09-24
  • 2020-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多