在使用 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
下面是一个简单的数据框。
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