可以传播()在tidyr传播多个价值?

时间:2017-02-08 02:58:38

标签: r tidyr spread

我正在使用iris数据集,首先,我对该数据集进行了一些操作,并将其转换为以下形式

D1 = iris[,c(1,2,5)]
D2 = iris[,c(3,4,5)]
colnames(D1)[1:2] = c('Length','Width')
colnames(D2)[1:2] = c('Length','Width')
D1 = D1 %>% mutate(Part = 'Sepal')
D2 = D2 %>% mutate(Part = 'Petal')
D = rbind(D2,D1)

看起来像

Species  Part Length Width
1  setosa Petal    1.4   0.2
2  setosa Petal    1.4   0.2
3  setosa Petal    1.3   0.2
4  setosa Petal    1.5   0.2
5  setosa Petal    1.4   0.2
6  setosa Petal    1.7   0.4

我想使用spread()中的tidyr函数使数据集最终看起来像以下格式

Measure Part setosa versicolor virginica
Length  Petal 1.4     4.7        6.0

我所做的是以下内容:

D4 = D %>% gather(Measure,value,3:4)

给出了

Species  Part Measure value
1  setosa Petal  Length   1.4
2  setosa Petal  Length   1.4
3  setosa Petal  Length   1.3
4  setosa Petal  Length   1.5
5  setosa Petal  Length   1.4
6  setosa Petal  Length   1.7

我尝试在'D4'中添加一个行号,因为我发现有时,spread()函数会导致一些错误,如here所述。 我不知道是否有一种巧妙的方法可以使用spread()来实现这一目标。

1 个答案:

答案 0 :(得分:1)

我们需要按组创建序列变量,然后spread

library(tidyverse)
D %>% 
   gather(Measure, value, Length, Width) %>% 
   group_by(Species, Part, Measure) %>%
   mutate(i1 = row_number()) %>% 
   spread(Species, value) %>%
   select(-i1)
#    Part Measure setosa versicolor virginica
#*  <chr>   <chr>  <dbl>      <dbl>     <dbl>
#1  Petal  Length    1.4        4.7       6.0
#2  Petal  Length    1.4        4.5       5.1
#3  Petal  Length    1.3        4.9       5.9
#4  Petal  Length    1.5        4.0       5.6
#5  Petal  Length    1.4        4.6       5.8
#6  Petal  Length    1.7        4.5       6.6
#7  Petal  Length    1.4        4.7       4.5
#8  Petal  Length    1.5        3.3       6.3
#9  Petal  Length    1.4        4.6       5.8
#10 Petal  Length    1.5        3.9       6.1
# ... with 190 more rows