【问题标题】:Calculate frequency of variables计算变量的频率
【发布时间】:2017-07-23 09:36:44
【问题描述】:

我想将一个数据框 (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

【问题讨论】:

标签: r


【解决方案1】:

在base-r中使用table函数:

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”函数来计算距离,而且我的原始数据有 10 万行因此,将上表转换为数据框时不起作用。错误:无法分配大小为 2.6GB 的向量
  • @RyanZfir 你如何转换为data.frame?试试as.data.frame.matrix(table(df))
  • 是的,我使用了相同的命令。实际上,我的主要目标是将上表更改为向量,以便我可以使用“dist”函数使用欧几里得方法计算每个向量之间的距离。
  • @RyanZfir 这个错误是在table 之后还是as.data.frame 之后还是dist 之后发生的?一般不用转换成data.frame就可以计算距离:dist(table(df))
【解决方案2】:
df = read.table(text="          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",header=T)

library(dplyr)
df = df %>% group_by(A,B) %>% mutate(n=n()) %>% ungroup %>% complete(A, B, fill = list(n = 0)) %>% as.data.frame 
df<- reshape(df,timevar="B",idvar="A",direction="wide")
colnames(df)<- gsub("n\\.","",colnames(df))

输出

   A   2011   2012   2013   2014
1 21      2      1      0      0
4 22      1      0      1      0
6 23      1      2      0      1

【讨论】:

    【解决方案3】:

    使用dplyrtidyr

    > 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)    
    

    分组,汇总每个组(tallysummarise(N = n()) 的简写)并分列(spread):

    > 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
    

    或者,通过使用内置的表格功能,然后使用 tidyr 进行传播(感谢用户 C.Square):

    > 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-14
      • 1970-01-01
      • 2014-12-18
      • 2019-11-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多