在使用 Tidyr 重塑之前替换数据帧多响应列中的 "x"

Replacing the "x" in Data Frame Multiple Response Columns before Reshaping Using Tidyr

下面是一个简单的数据框。

Program <- c("A","B","C","D","E")
Apartment <- c("x","","","x","")
House <- c("x","","x","","")
Condo <- c("","x","","","x")
Cat <- c("x","","x","","")
Dog <- c("","x","","","")
Fish <- c("","x","","x","x")

DF1 <- data.frame(Program,Apartment,House,Condo,Cat,Dog,Fish)

使用这个数据框,我想使用 Tidyr 创建下面的 table。 table 按住宿提供每只宠物的数量。所以对于那些有公寓的人来说,有一个猫实例和一个鱼实例。

为了实现这一点,我首先必须在熔化数据之前用每列的昵称替换 "x's"。我想知道如何在一行代码或一个函数中跨所有列执行此操作。

我在使用 Tidyr 或 Reshape2 以下面的确切形式创建 table 时也遇到了问题。 (下面的table没有完全排成一行,但是每个数字都应该在宠物名字下面。所以对于第一行,1应该在cat下面,0应该在dog下面,而1下鱼等...)

      variable         Cat      Dog    Fish 
1     Apartment          1        0       1
2     House              2        0       0
3     Condo              0        1       2

我们可以试试dplyr/tidyr

library(dplyr)
library(tidyr)
DF1 %>% 
    gather(House, Val, Apartment:Condo) %>% 
    filter(Val!="") %>% 
    gather(Animals, Val2, Cat:Fish) %>%
    group_by(House, Animals) %>%
    summarise_each(funs(sum(.!='')), Val:Val2)  %>%
    spread(Animals, Val2) %>%
    select(-Val)   
#      House   Cat   Dog  Fish
#      <chr> <int> <int> <int>
#1 Apartment     1     0     1
#2     Condo     0     1     2
#3     House     2     0     0

基本版本:

tmp <- data.frame(DF1[-1]=="x")
tmp <- data.frame(stack(tmp[1:3]), tmp[4:6])

aggregate(cbind(Cat,Dog,Fish) ~ ind, data=tmp, subset=tmp$values, FUN=sum)

#        ind Cat Dog Fish
#1 Apartment   1   0    1
#2     Condo   0   1    2
#3     House   2   0    0