我有这么一个数据
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这是足球员在场上的坐标(不包括守门员)。我想再增加一列“队形”,它从以前的列中计算出坐标数的出现数,以便产生足球队形。
例如,对于第一行,有四个3s,四个7s和两个10s,这将产生4-4-2的形成。
此外,一些坐标数字可能不会出现在一起。对于第3行,“6”出现在Y1、Y4和Y5中。
基本上,形成的一般模式应该是a (- the ),其中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发布于 2016-11-19 08:24:03
我们可以循环通过行,得到频率计数与table,paste频率在一起,以创建‘形成’列。
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"发布于 2016-11-19 08:40:18
有了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的字符串中的计数来创建的。https://stackoverflow.com/questions/40689961
复制相似问题