我有一个如下所示的数据集。
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)
有关如何获得所需结果的任何建议?
答案 0 :(得分:3)
我们需要一个序列列,因为有重复的标识符。具体来说,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")
)