我正在使用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()
来实现这一目标。
答案 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