1

我正在使用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()函数会导致出现一些错误,如此所述。我不知道是否有一种巧妙的方法可以spread()用来实现这个目标。

4

1 回答 1

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
于 2017-02-08T03:42:57.230 回答