我有这样的数据框
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
答案 0 :(得分:2)
我们可以循环遍历行,将频率计数与table
,paste
频率一起计算,以创建&#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
Formation
是通过折叠每个行ID的字符串中的计数来创建的。