我有一个如下所示的数据集。
df = data.frame(val=c(4,2,6,3,4,5),
algo=c("A","A","A","C","C","C"),
id=c("james","james","james",
"james","james","james"))
df
我想改变数据框架的结构,以便它是宽格式的。
id algo.A algo.C
james 4 3
james 2 4
james 6 5
我尝试了tidyr,但是得到了下面的错误。
> spread(df, id, algo)
Error: Duplicate identifiers for rows (1, 5)
对于如何获得预期的结果,有什么建议吗?
发布于 2018-05-08 08:53:26
我们需要一个序列列,因为有重复的标识符。具体来说,spread
不能知道algo
的不同行应该是不同的,因为它们对于id
都具有相同的值。通过在sep
中指定spread
参数,我们可以获得列名前缀:
library(tidyverse)
df %>%
group_by(id, algo) %>%
mutate(rn = row_number()) %>%
spread(algo, val, sep = ".") %>%
select(-rn)
# A tibble: 3 x 3
# Groups: id [1]
# id algo.A algo.C
# <fct> <dbl> <dbl>
#1 james 4 3
#2 james 2 4
#3 james 6 5
数据
df <- data.frame(
val = c(4, 2, 6, 3, 4, 5),
algo = c("A", "A", "A", "C", "C", "C"),
id = c("james", "james", "james", "james", "james", "james")
)
https://stackoverflow.com/questions/50238656
复制相似问题