每个元素的R计数列,无论冗余

时间:2014-03-10 01:36:29

标签: r dataframe

很抱歉,如果我问的是明显的东西,但找不到类似的东西。

假设我有这些数据:

a<-c('blue','blue','green','red','black',
     'white','blue','blue','blue','red',
     'black','white','blue','green','red',
     'black','white','white','black','white',
     'blue','white','blue','green')

并希望将其放在数据框中,其中的列总结了每个元素在整个向量中出现的次数,无论它是多余的。像这样:

data.frame(a=c('blue','blue','green','red',
               'black','white','blue','blue',
               'blue','red','black','white',
               'blue','green','red','black',
               'white','white','black','white',
               'blue','white','blue','green'),
           b=c(8,8,3,3,4,6,8,8,8,3,4,
               6,8,3,3,4,6,6,4,6,8,6,8,3))

任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分:2)

根据mnel链接的问题的精神,以下是如何使用ave:

data.frame(a, b=ave(seq_along(a), a, FUN=length))
       a b
1   blue 8
2   blue 8
3  green 3
4    red 3
5  black 4
6  white 6
7   blue 8
8   blue 8
9   blue 8
10   red 3
11 black 4
12 white 6
13  blue 8
14 green 3
15   red 3
16 black 4
17 white 6
18 white 6
19 black 4
20 white 6
21  blue 8
22 white 6
23  blue 8
24 green 3

这使用了一个虚假的数字向量,只取每个值的长度。

采用1的向量并取总和可能更有意义:

data.frame(a, b=ave(rep(1, length(a)), a, FUN=sum))

结果是一样的。

答案 1 :(得分:1)

计算频率

counts<-table(a)

将其变为data.frame

df<-as.data.frame(counts)

对于df中的每一行,重复频率

df2 <- sapply(1:nrow(df), 
   function(x) df[rep(x, df$Freq[x]), ],simplify = FALSE)

将数据帧列表转换为一个数据帧

df3<-do.call("rbind", df2)

df3
    a Freq
black    4
black    4
black    4
black    4
 blue    8
 blue    8
 blue    8
 blue    8
 blue    8
 blue    8
 blue    8
 blue    8
green    3
green    3
green    3
  red    3
  red    3
  red    3
white    6
white    6
white    6
white    6
white    6
white    6