我努力纠正我的代码。给定此数据帧
S <- data.frame(Z1=c("A","A","A","D","D","A","A","A"),
Z2=c("A","A","A","D","D","C","C","D"),
K1=c(24,36,44,63,34,26,19,23),
K2=c(12,24,13,16,23,25,12,34))我应用了这个转换:
B <- sapply(1:2, function(x) {
x1 <- S[c(x, x+2)]
tapply(x1[,2], x1[,1], FUN=function(S) ceiling(median(S)))
})
colnames(B) <- c("G1","G2")我希望将B设置为
G1 G2
C 0 19
B 0 0
A 25 13
D 49 23但我得到的却是这个错误:
Error in `colnames<-`(`*tmp*`, value = c("G1", "G2")) :
attempt to set 'colnames' on an object with less than two dimensions发布于 2015-04-02 05:04:10
你的问题之一是,R不知道你认为Z1和Z2是可以接受A,B,C,D值的分类变量。你告诉它的方式是factor类型。
S <- data.frame(Z1=c("A","A","A","D","D","A","A","A"),
Z2=c("A","A","A","D","D","C","C","D"),
K1=c(24,36,44,63,34,26,19,23),
K2=c(12,24,13,16,23,25,12,34))
S$Z1 <- factor(S$Z1, levels=c("A", "B", "C", "D"))
S$Z2 <- factor(S$Z2, levels=c("A", "B", "C", "D"))请注意,我必须明确地说明,A、B、C、D中的所有四个都是可能的,即使它们并不都出现。完成此操作后,您的转换函数将生成一个2D矩阵,colnames可应用于该矩阵。
B <- sapply(1:2, function(x) {
x1 <- S[c(x, x+2)]
tapply(x1[,2], x1[,1], FUN=function(S) ceiling(median(S)))
})
colnames(B) <- c("G1","G2")然而,你没有在你期望的地方得到0,你得到的是NAs:
> B
G1 G2
A 25 13
B NA NA
C NA 19
D 49 23这是因为空集的中位数是未定义的。你可以用is.na来掩盖这一点
> B[is.na(B)] <- 0
> B
G1 G2
A 25 13
B 0 0
C 0 19
D 49 23此外,S[c(x, x+2)]的东西非常脆弱,如果我是您,我就不会在生产代码中依赖它。同样,在使用sapply(1:2, function(x) ...)时,函数对全局变量进行操作。
您可能会发现reshape2包更容易说服它去做您想做的事情。
https://stackoverflow.com/questions/29400272
复制相似问题