首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用sapply和tapply

使用sapply和tapply
EN

Stack Overflow用户
提问于 2015-04-02 04:35:06
回答 1查看 103关注 0票数 1

我努力纠正我的代码。给定此数据帧

代码语言:javascript
复制
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))

我应用了这个转换:

代码语言:javascript
复制
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设置为

代码语言:javascript
复制
       G1   G2
C       0   19
B       0    0
A      25   13
D      49   23

但我得到的却是这个错误:

代码语言:javascript
复制
Error in `colnames<-`(`*tmp*`, value = c("G1", "G2")) : 
  attempt to set 'colnames' on an object with less than two dimensions
EN

回答 1

Stack Overflow用户

发布于 2015-04-02 05:04:10

你的问题之一是,R不知道你认为Z1Z2是可以接受A,B,C,D值的分类变量。你告诉它的方式是factor类型。

代码语言:javascript
复制
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可应用于该矩阵。

代码语言:javascript
复制
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:

代码语言:javascript
复制
> B
  G1 G2
A 25 13
B NA NA
C NA 19
D 49 23

这是因为空集的中位数是未定义的。你可以用is.na来掩盖这一点

代码语言:javascript
复制
> 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包更容易说服它去做您想做的事情。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29400272

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档