CUT R - Traspose Data Frame

时间:2018-05-12 14:55:13

标签: r cut

使用虹膜数据集我想生成4个范围并将它们放在列中。此外,我希望有4个额外的列,每个范围包含的数量。

我为您提供了迄今为止我所做的以获取相关信息的代码。

library(data.table)
setDT(iris)[ , bins := cut(Sepal.Length,4), by = list(Species)]
setDT(iris)[ , bins_n := table(bins), by = list(Species)]

table(iris[iris$Species=='setosa',]$bins)

(4.9,5.65] (5.65,6.4] (6.4,7.15] (7.15,7.9] 
9         19         17          5 

iris2<-data.frame(species="setosa",D1="(4.9,5.65]",D2="(5.65,6.4]",D3="(6.4,7.15]",D4="(7.15,7.9]",C1=9,C2=19,C3=17,C4=5)

因此,最终输出将是

  species         D1         D2         D3         D4 C1 C2 C3 C4
1  setosa (4.9,5.65] (5.65,6.4] (6.4,7.15] (7.15,7.9]  9 19 17  5

如果我可以添加其范围如下的其他物种,那就更好了。

谢谢!

1 个答案:

答案 0 :(得分:1)

我们可以做一个stack并将其重塑为广泛的&#39;来自&#39; tbl&#39;输出

library(data.table)
dcast(setDT(stack(as.list(tbl)))[, species := "setosa"], 
   species ~ rowid(species), value.var = c("ind","values"))

如果我们想要所有的物种&#39;

dcast(iris[, .(C =.N), .((D = bins),Species)],
     Species ~ rowid(Species), value.var = c("D", "C"), sep="")
#      Species         D1         D2         D3         D4 C1 C2 C3 C4
#1:     setosa (6.4,7.15] (5.65,6.4] (4.9,5.65] (7.15,7.9] 17 19  9  5
#2: versicolor (7.15,7.9] (6.4,7.15] (5.65,6.4] (4.9,5.65]  9 15 20  6
#3:  virginica (5.65,6.4] (6.4,7.15] (7.15,7.9] (4.9,5.65] 22 15 11  2

数据

tbl <- table(iris[iris$Species=='setosa',]$bins)