样本数据:
a <- as.data.frame(matrix(list(1,1,3,4,1,1,3,4,1,1,3,4,1,1,3,4,1,1,3,4),4,5))
b1 <-c(30,40,20,15) b2<-c("A","A","B","C")
b <-as.data.frame(cbind(b1,b2))
a.b<-cbind(a,b)初始值:a.b
row V1 V2 V3 V4 V5 b1 b2
1 1 1 1 1 1 30 A
2 1 1 1 1 1 40 A
3 3 3 3 3 3 20 B
4 4 4 4 4 4 15 C我想看到的是V1,V2,V3,V4,V5,b1和max(b1),A,B,C应该有3行:
row V1 V2 V3 V4 V5 b1 A B C
1 1 1 1 1 1 40 2 0 0
3 3 3 3 3 3 20 0 1 0
4 4 4 4 4 4 15 0 0 1我该怎么做才能得到。我曾经想过聚集、铸造和重塑,但却遇到了困难。泰克斯。
发布于 2014-03-10 10:45:48
这看起来像一个(拆分(.))问题来了。未经测试并假设您不使用as.data.frame(cbind(.))
lapply(split(df, df[2:6]), function (d){
cbind( max( d[7]), table(d[8]) )})不使用字符比较的原因是"4“> "15”返回TRUE。
发布于 2014-03-10 01:38:23
这不是小事一桩。
这是我的方法,它远不是完美的,但它应该足以让你开始:
first_part = aggregate(a.b[,1:6],by=list(a.b$b2),
function(x) {y=as.factor(unlist(x));max(as.numeric(levels(y))[y])})
second_part = diag(by(a.b$b2,a.b$b2,function(x)length(x)))
colnames(second_part) = first_part[,1]
all = cbind(first_part[2:7], second_part)它的工作是:
> all
V1 V2 V3 V4 V5 b1 A B C
1 1 1 1 1 1 40 2 0 0
2 3 3 3 3 3 20 0 1 0
3 4 4 4 4 4 15 0 0 1对其工作方式的解释:
第一行构造矩阵的第一部分:保留b1的最大值行。
> first_part
Group.1 V1 V2 V3 V4 V5 b1
1 A 1 1 1 1 1 40
2 B 3 3 3 3 3 20
3 C 4 4 4 4 4 15“!”这个方法就是如此:它对所有同字母的行中的所有元素都应用了max函数。但是,在V1...V5中的值不同时,您没有指定要做什么。
第二行和第三行构成矩阵的第二部分:
A B C
[1,] 2 0 0
[2,] 0 1 0
[3,] 0 0 1总的来说,我相信有更好和更清洁的方法来做到这一点。如果你看到一个可能的改进,我总是很高兴学到一些新的东西:)
https://stackoverflow.com/questions/22290225
复制相似问题