【发布时间】:2021-06-08 20:10:45
【问题描述】:
我正在努力更好地处理来自gather 用户的pivot_longer。从源文档看来,我应该能够使用 name_pattern 或 names_sep 在单个命令中执行以下操作,但我一直无法找到可行的解决方案。
数据
id1 <- c("person1","person2","person3")
id2 <- c("1001","1002","1003")
id3 <- c("2001","2002", "2003")
value_1 <- c(10,50,100)
value_2 <- c(20,200, 2000)
status_1 <- c("OK","BAD","GOOD")
status_2 <- c("AWFUL","EXCELLENT","AVERAGE")
df <- data.frame(id1,id2,id3,value_1,value_2,status_1,status_2)
预期输出:
id1 id2 id3 gradeLevel status value
1 person1 1001 2001 1 OK 10
2 person1 1001 2001 2 AWFUL 20
3 person2 1002 2002 1 BAD 50
4 person2 1002 2002 2 EXCELLENT 200
5 person3 1003 2003 1 GOOD 100
6 person3 1003 2003 2 AVERAGE 2000
我可以通过 gather 语句和一些额外的行来实现这一点:
df %>%
gather(key, value,-id1, -id2,-id3) %>%
separate(key, c('cat', 'gradeLevel'),sep ="_") %>%
distinct() %>%
spread(cat,value)
有没有办法用pivot_longer 简化这个?我认为 names_pattern 很有希望,但我在使用正则表达式时遇到了困难。我的大部分尝试都是尝试组合不同类型的列(双倍和因子)
df %>%
pivot_longer(cols = value_1:status_2, names_to = c('col', '.value'), names_pattern = "(.*)_(.)")
【问题讨论】: