R 计算变量的频率

R 计算变量的频率,r,R,我想将数据帧(df)转换为不同的数据帧(df1),其中df1的行对应于列B(df)的出现频率。也就是说,在数据帧df1中,对于df的列“a”的特定变量,行中的值对应于它们出现在df的列B中的次数。以下是一个例子: df A B 1. 21 2011 2. 21 2012 3. 21 2011 4. 22 2013 5. 22 2011 6. 23 2012 7. 23

我想将数据帧(
df
)转换为不同的数据帧(
df1
),其中
df1
的行对应于列B(
df
)的出现频率。也就是说,在数据帧
df1
中,对于
df
的列“a”的特定变量,行中的值对应于它们出现在
df
的列B中的次数。以下是一个例子:

df


      A        B
  1. 21      2011
  2. 21      2012
  3. 21      2011
  4. 22      2013
  5. 22      2011
  6. 23      2012
  7. 23      2011
  8. 23      2012
  9. 23      2014

df1

           2011   2012    2013    2014
  1. 21     2       1       0       0
  2. 22     1       0       1       0
  3. 23     1       2       0       1

使用
dplyr
tidyr

> library(tidyr)
输入:

> df <- read.csv(text="A,B
21,2011
21,2012
21,2011
22,2013
22,2011
23,2012
23,2011
23,2012
23,2014", header=T)    
输出:

> df2
# A tibble: 3 x 5
# Groups:   A [3]
      A `2011` `2012` `2013` `2014`
* <int>  <int>  <dbl>  <dbl>  <dbl>
1    21      2      1      0      0
2    22      1      0      1      0
3    23      1      2      0      1

使用base-r中的
功能:

table(df)
#      B
# A    2011 2012 2013 2014
# 21    2    1    0    0
# 22    1    0    1    0
# 23    1    2    0    1

可能重复的,换句话说:数据透视:-)我想将“df”转换为“df1(另一个数据帧)”,然后在向量中转换,这样我就可以使用“dist”函数计算距离,而且我的原始数据有1行,因此,将上表转换为数据帧时不起作用。错误:无法分配大小为2的向量。6GB@RyanZfir如何转换为data.frame?尝试
as.data.frame.matrix(table(df))
yes,我使用了相同的命令。实际上,我的主要目标是将上面的表格更改为向量,以便我可以使用“dist”函数使用欧几里德方法计算每个向量之间的距离。@RyanZfir此错误是否发生在
表格
之后或
as.data.frame
之后或
dist
之后?通常,您可以计算距离而无需转换为数据。帧:
dist(表(df))
> df2 <- df %>% group_by(A,B) %>% tally %>% spread(B, n)
> df2[is.na(df2)] <- 0
> df2
# A tibble: 3 x 5
# Groups:   A [3]
      A `2011` `2012` `2013` `2014`
* <int>  <int>  <dbl>  <dbl>  <dbl>
1    21      2      1      0      0
2    22      1      0      1      0
3    23      1      2      0      1
> table(df) %>% data.frame %>% spread(B, Freq)
   A 2011 2012 2013 2014
1 21    2    1    0    0
2 22    1    0    1    0
3 23    1    2    0    1
table(df)
#      B
# A    2011 2012 2013 2014
# 21    2    1    0    0
# 22    1    0    1    0
# 23    1    2    0    1