将频率列添加到 R 中的 df

Adding frequency column to df in R

我有一个包含 3 列和数千行的数据框。我需要计算变量#3 的频率,为此我在 R 中使用了 table 函数。问题是,table returns 一个单独的 2 列 table(变量正在计算频率的频率和计算出的频率),并且没有参考原始数据框,所以我无法将频率结果与数据框上的其他列相关联。

我已经尝试了 2 种方法,但都没有成功(两种解决方案都适用于我,尽管一种可能比另一种更有效):

  1. 将引用原始数据帧的 ID 列(至少对于第一次出现的频率考虑的因素)添加到 table 的输出(在我的例子中,会类似于以频率 table 和原始 df 的第 1 列应用 cbind,但这不会起作用,因为两个对象的行数不同)

  2. 使用特定列的频率向原始数据框添加一个新列(我已经尝试 mutate 但没有成功)

一些示例数据:

dfg <- data.frame(f=c(1,2,3,4,5),v1=c("a","b","b","c","c"),v2=c("3r","3r","3r","gh","y"))
dfg  
    f v1 v2
    1 1  a 3r
    2 2  b 3r
    3 3  b 3r
    4 4  c gh
    5 5  c  y

解决方案 1) 是:

     3r gh  y 
     3  1  1 
 f   1  4  5

解决方案 2) 是:

f v1 v2  freq(v2)
1 1  a 3r  3
2 2  b 3r  3
3 3  b 3r  3
4 4  c gh  1
5 5  c  y  1

你们已经很接近了。现在,您只需要 link 频率 table 回到 table,使用 v2 作为键:

dfg$v3 = table(dfg$v2)[dfg$v2]

这样就可以了。

由于频率 table 只是一个命名向量,您可以使用键来引用频率 table 中的条目。而v2自然是拥有了所有的钥匙

dfg <- data.frame(f=c(1,2,3,4,5),v1=c("a","b","b","c","c"),v2=c("3r","3r","3r","gh","y"))

#1
library(dplyr)

dfg %>% group_by(v2) %>%
  summarise(n = n(),
            f = first(f)) %>%
  t() %>% as.data.frame() %>%
  janitor::row_to_names(1)
#>   3r gh y
#> n  3  1 1
#> f  1  4 5

#2
transform(dfg, freq_v2 = ave(dfg$f, dfg$v2, FUN = length))
#>   f v1 v2 freq_v2
#> 1 1  a 3r       3
#> 2 2  b 3r       3
#> 3 3  b 3r       3
#> 4 4  c gh       1
#> 5 5  c  y       1

reprex package (v2.0.0)

创建于 2021-05-22