我尝试在tidyverse包中使用收集和传播函数,但它在扩散函数中引发错误
库(脱字符号)
dataset<-iris
# gather function is to convert wide data to long data
dataset_gather<-dataset %>% tidyr::gather(key=Type,value = Values,1:4)
head(dataset_gather)
# spead is the opposite of gather
此代码会抛出类似错误:行的重复标识符
dataset_spead<- dataset_gather%>%tidyr::spread(key = Type,value = Values)
答案 0 :(得分:2)
我们可以使用data.table
library(data.table)
dcast(melt(setDT(dataset, keep.rownames = TRUE), id.var = c("rn", "Species")), rn + Species ~ variable)
答案 1 :(得分:2)
稍后添加:抱歉@alistaire,在发布此回复后才看到您对原始帖子的评论。
据我所知Error: Duplicate identifiers for rows...
,当您拥有具有相同标识符的值时,就会发生这种情况。例如在原来的&#39; iris&#39;数据集, Species = setosa 的前五行都有 Petal.Width 为0.2,而三行Petal.Length
的值为1.4。收集这些数据并不是一个问题,但是当你尝试传播这些数据时,该功能并不知道什么属于什么。也就是说,0.2 Petal.Width 和1.4 Petal.Length 属于 setosa 的哪一行。
我在这种情况下使用的(tidyverse)解决方案是在收集阶段为每行数据创建一个唯一的标记,以便当您想要再次传播时,该函数可以跟踪哪些重复数据属于哪些行。见下面的例子:
# Load packages
library(dplyr)
library(tidyr)
# Get data
dataset <- iris
# View dataset
head(dataset)
#> Sepal.Length Sepal.Width Petal.Length Petal.Width Species
#> 1 5.1 3.5 1.4 0.2 setosa
#> 2 4.9 3.0 1.4 0.2 setosa
#> 3 4.7 3.2 1.3 0.2 setosa
#> 4 4.6 3.1 1.5 0.2 setosa
#> 5 5.0 3.6 1.4 0.2 setosa
#> 6 5.4 3.9 1.7 0.4 setosa
# Gather data
dataset_gathered <- dataset %>%
# Create a unique identifier for each row
mutate(marker = row_number(Species)) %>%
# Gather the data
gather(key = Type, value = Values, 1:4)
# View gathered data
head(dataset_gathered)
#> Species marker Type Values
#> 1 setosa 1 Sepal.Length 5.1
#> 2 setosa 2 Sepal.Length 4.9
#> 3 setosa 3 Sepal.Length 4.7
#> 4 setosa 4 Sepal.Length 4.6
#> 5 setosa 5 Sepal.Length 5.0
#> 6 setosa 6 Sepal.Length 5.4
# Spread it out again
dataset_spread <- dataset_gathered %>%
# Group the data by the marker
group_by(marker) %>%
# Spread it out again
spread(key = Type, value = Values) %>%
# Not essential, but remove marker
ungroup() %>%
select(-marker)
# View spread data
head(dataset_spread)
#> # A tibble: 6 x 5
#> Species Petal.Length Petal.Width Sepal.Length Sepal.Width
#> <fctr> <dbl> <dbl> <dbl> <dbl>
#> 1 setosa 1.4 0.2 5.1 3.5
#> 2 setosa 1.4 0.2 4.9 3.0
#> 3 setosa 1.3 0.2 4.7 3.2
#> 4 setosa 1.5 0.2 4.6 3.1
#> 5 setosa 1.4 0.2 5.0 3.6
#> 6 setosa 1.7 0.4 5.4 3.9
(和Jenny Bryan一样,感谢reprex
包裹)