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