如何添加一列来计算前一列中唯一字符的出现次数?

时间:2016-11-19 06:38:15

标签: r

我有这样的数据框

mydf <- data.frame(Y1 = c('3','3','6','6'),Y2 = c('3','3','3','3'), 
Y3 = c('3','3','3','6'),Y4 = c('3','3','6','6'),Y5 = c('7','6','6','6'),
Y6 = c('7','8','8','8'),Y7 = c('7','6','3','8'),Y8 = c('7','8','8','7'),
Y9 = c('10','10','8','7'),Y10 = c('10','10','8','7')) 

   Y1 Y2 Y3 Y4 Y5 Y6 Y7 Y8 Y9 Y10
1  3  3  3  3  7  7  7  7  10 10
2  3  3  3  3  6  8  6  8  10 10
3  6  3  3  6  6  8  3  8  8  8
4  6  3  6  6  6  8  8  7  7  7

这些是场上足球运动员的坐标(守门员除外)。 我想再增加一个专栏&#39; Formation&#39;计算前一列中坐标数字的出现次数以产生足球形成。

例如,对于第一行,有四个3,四个7和两个10,这将产生4-4-2

的形成

此外,某些坐标编号可能不会一起显示。对于第3行,&#39; 6&#39;出现在Y1,Y4和Y5中。

  

基本上,形成的一般模式应该是abc(-de),其中a,b,c,d,e表示第一,第二,第三(第四,第五,如果适用)唯一号码。

例如,对于此数据集,结果应该产生:

       Y1 Y2 Y3 Y4 Y5 Y6 Y7 Y8 Y9 Y10 Formation
    1  3  3  3  3  7  7  7  7  10 10  4-4-2
    2  3  3  3  3  6  8  6  8  10 10  4-2-2-2
    3  6  3  3  6  6  8  3  8  8  8   3-3-4
    4  6  3  6  6  6  8  8  7  7  7   4-1-2-3

2 个答案:

答案 0 :(得分:2)

我们可以循环遍历行,将频率计数与tablepaste频率一起计算,以创建&#39;形成&#39;列。

df1$Formation <- apply(df1, 1, FUN = function(x) 
         paste(table(factor(x, levels=unique(x))), collapse="-"))
df1$Formation
#[1] "4-4-2"   "4-2-2-2" "3-3-4"   "4-1-2-3"

答案 1 :(得分:2)

使用data.table,您可以

library(data.table)
wide <- setDT(mydf, keep.rownames = TRUE)  
long <-  melt(wide, id.vars = "id")
formation <- long[, .N, by = .(id, value)][, .(Formation = paste(N, collapse = "-")), by = id]
wide[formation, on = "id"][, id := NULL][]

#   Y1 Y2 Y3 Y4 Y5 Y6 Y7 Y8 Y9 Y10 Formation
#1:  3  3  3  3  7  7  7  7 10  10     4-4-2
#2:  3  3  3  3  6  8  6  8 10  10   4-2-2-2
#3:  6  3  3  6  6  8  3  8  8   8     3-3-4
#4:  6  3  6  6  6  8  8  7  7   7   4-1-2-3

说明

  • 在添加行ID时,data.frame被强制转换为data.table。
  • 重新形成长形后,按行ID和坐标分组计数出现次数。 Formation是通过折叠每个行ID的字符串中的计数来创建的。
  • 最后,结果与我们开始使用的data.table结合在一起。行ID列将被删除,因为不再需要它。