如何转换泰坦尼克号数据集



请 我想将泰坦尼克号数据集转换为名为 Tita 的数据集,其中每条线都是乘客,您将从每条单独线路的频率生成。例如,如果我有一条来自泰坦尼克号的线,其中年龄 = 孩子,性别 = 男性和频率 = 11,然后在 Tita 11 中生成年龄为儿童且性别为男性的行。 然后,Tita应该只包含四个属性(Freq属性将被消除(。 我应该使用从 1 到 4 的循环和连接属性以形成数据集的 cbind 函数。 在每次迭代中,我应该通过使用 rep 函数重现其每个 Freq 值来构建泰坦尼克号的属性。

> 1( as.data.frame/repTitanic数组转换为数据帧tdf,然后针对每个行号和频率使用该行号重复该行号该次数,并使用rep和下标tdf。 不使用任何包。

tdf <- as.data.frame(Titanic)
Tita <- tdf[rep(1:nrow(tdf), tdf$Freq), -5]

我们可以通过将Tita转换回数组来检查它,该数组的元素应等于Titanic

all.equal(Titanic, table(Tita))
## [1] TRUE

2( tableinv从我们的检查中,我们意识到问题所要求的基本上是table函数的逆函数,因此我们在谷歌上搜索,我们在这里找到tableinv:table(( 函数是否存在一般逆函数?

将该函数复制并粘贴到 R 中允许我们编写:

Tita2 <- tableinv(Titanic)

除属性外,这给出的值与 (1( 中的Tita相同

all.equal(Tita, Tita2, check.attributes = FALSE)
## [1] TRUE

一种选择是将4D数组melt2Ddata.frame 中,然后使用uncount根据"value"列复制行

library(dplyr)
library(tidyr)
data(Titanic)    
Tita <- reshape2::melt(Titanic) %>%
uncount(value) %>% 
as_tibble
Tita
# A tibble: 2,201 x 4
#   Class Sex   Age   Survived
#   <fct> <fct> <fct> <fct>   
# 1 3rd   Male  Child No      
# 2 3rd   Male  Child No      
# 3 3rd   Male  Child No      
# 4 3rd   Male  Child No      
# 5 3rd   Male  Child No      
# 6 3rd   Male  Child No      
# 7 3rd   Male  Child No      
# 8 3rd   Male  Child No      
# 9 3rd   Male  Child No      
#10 3rd   Male  Child No      
# … with 2,191 more rows

或使用base R(不使用包(

d1 <- as.data.frame(Titanic)
Tita <- d1[rep(seq_len(nrow(d1)), d1$Freq),1:4]
row.names(Tita) <- NULL

最新更新