将频率列添加到 R 中的 df
Adding frequency column to df in R
我有一个包含 3 列和数千行的数据框。我需要计算变量#3 的频率,为此我在 R 中使用了 table
函数。问题是,table
returns 一个单独的 2 列 table(变量正在计算频率的频率和计算出的频率),并且没有参考原始数据框,所以我无法将频率结果与数据框上的其他列相关联。
我已经尝试了 2 种方法,但都没有成功(两种解决方案都适用于我,尽管一种可能比另一种更有效):
将引用原始数据帧的 ID 列(至少对于第一次出现的频率考虑的因素)添加到 table
的输出(在我的例子中,会类似于以频率 table 和原始 df 的第 1 列应用 cbind
,但这不会起作用,因为两个对象的行数不同)
使用特定列的频率向原始数据框添加一个新列(我已经尝试 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
我有一个包含 3 列和数千行的数据框。我需要计算变量#3 的频率,为此我在 R 中使用了 table
函数。问题是,table
returns 一个单独的 2 列 table(变量正在计算频率的频率和计算出的频率),并且没有参考原始数据框,所以我无法将频率结果与数据框上的其他列相关联。
我已经尝试了 2 种方法,但都没有成功(两种解决方案都适用于我,尽管一种可能比另一种更有效):
将引用原始数据帧的 ID 列(至少对于第一次出现的频率考虑的因素)添加到
table
的输出(在我的例子中,会类似于以频率 table 和原始 df 的第 1 列应用cbind
,但这不会起作用,因为两个对象的行数不同)使用特定列的频率向原始数据框添加一个新列(我已经尝试
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