1

我在数据框中有以下格式的数据:

id a b c d e f x y z
1  0 0 0 1 1 0 1 0 1 
2  1 0 0 1 0 0 1 0 0 

我想做的是找出 a 和 x 在同一个地方有多少次 1,a 和 y 在同一行中有多少次 1,依此类推。本质上,(a,b,c,d,e,f) 和 (x,y,z) 应该被分组为两个变量。

我一直在尝试使用 reshape 包(使用 melt 和 cast )来做到这一点,我能想到的最好的东西看起来像下面这样:

id a b c d e f x y z
1  1 0 0 0 1 0 10 5 3 
2  0 1 0 1 0 0 25 0 48

我想看到的是这样的:

  x    y    z
a 10   5    3
b 25   0    48

我真的很感谢你在这方面的帮助。我是 reshape 包的新手。

问候,

阿伦

4

3 回答 3

2

如果您的数据在 data framedata中,您可以执行以下操作:

mdata <- melt(data, measure.vars=c("a","b","c","d","e","f"))
mmdata <- melt(mdata, measure.vars=c("x","y","z"))
colnames(mmdata) <- c("var1","val1","var2","val2")
mmdata <- mmdata[mmdata$val1 & mmdata$val2,]
cast(mmdata, var1~var2)
于 2012-06-01T11:15:26.520 回答
1

这可能是一个解决方案,但可能会有更简单或更清洁的东西。它使用的是 double sapply,我认为我有一天不会使用它 :-) :

这是您的数据:

d <- data.frame(a=c(1,0,1),
                b=c(1,0,0),
                c=c(0,1,1),
                x=c(1,1,1),
                y=c(1,0,0),
                z=c(1,0,1))

首先,我们在两组变量之间拆分数据:

d1 <- d[,c("a","b","c")]
d2 <- d[,c("x","y","z")]

这是代码:

tmptab <- function(v1,v2) {
  tab <- as.data.frame(table(v1,v2))
  result <- tab$Freq[tab$v1==1 & tab$v2==1]
  if (is.na(result)) result <- 0
  return(result)
}

sapply(d2, function(v) {
  sapply(d1, tmptab, v)
})

这使 :

  x y z
a 2 1 2
b 1 1 1
c 2 0 1
于 2012-06-01T11:07:29.683 回答
0

挖骷髅……

这是一种可能的方法。不知道它是否比其他人有任何改进......

## Save ourselves some typing...
Group1 <- c("a", "b", "c", "d", "e")
Group2 <- c("x", "y", "z")

## melt the data
A <- melt(mydf, id.vars="id")

## Split and merge
B <- Reduce(function(x, y) merge(x, y, by = "id"), 
            split(A, A$variable %in% Group1))

## Subset
B.sub <- B[B$value.x == 1 & B$value.y == 1, c("variable.y", "variable.x")]

## Factor (so table works nicely)
## Without `factor`, rows or columns which are all zeroes
##   will be dropped during the tabulation, which may be fine
B.sub$variable.y <- factor(B.sub$variable.y, Group1)
B.sub$variable.x <- factor(B.sub$variable.x, Group2)

## Tabulate
table(B.sub)
#           variable.x
# variable.y x y z
#          a 1 0 0
#          b 0 0 0
#          c 0 0 0
#          d 2 0 1
#          e 1 0 1
于 2014-03-08T10:36:56.927 回答