拆分camelCase列名

时间:2015-01-19 15:04:14

标签: regex r dplyr tidyr

我一直在努力解决这个问题,并且我想在这里问一下。

假设我有一个如下数据框:

df <- data.frame(participant = 1:6, group = c("adult", "adult", "child", "child", "NSS", "NSS"), RegProto = c(2, 3, 4, 2, 4, 3), RegInt = c(2, 3, 4, 6, 6, 5), RegDistant = c(3, 3, 4, 5, 4, 5), IrregProto = c(4, 5, 3, 4, 3, 1), IrregInt = c(4, 4, 4, 4, 4, 4), IrregDistant = c(4, 5, 6, 8, 9, 1))

此数据框的问题是每个变量包含两个变量:一个变量的值为RegIrreg,另一个变量的值为ProtoInt,或Distant。我想要做的是拆分这些列并使表长,最好使用tidyr。我以为我可以这样做。

library("tidyr")
df_long <- df %>%
gather(index, n, -group, -participant) %>%
select(participant, group, index, n) %>%
separate(index, into = c("verb", "similarity"), sep = "\\.?=\\p{Upper}")

separate()之前,这就是我想要的。我收到一条错误消息,指出这些值没有拆分,但没有其他建议可能会出现这种情况。我是正则表达式的新手,所以我怀疑问题必定存在,但我无法弄清楚正确的语法是什么。

1 个答案:

答案 0 :(得分:9)

您可以使用此正则表达式:

(?<=.)(?=[A-Z])

这表示(零长度)位置后跟一个大写字母,后面跟任何字符。

命令:

library(dplyr)
df %>%
  gather(index, n, -group, -participant) %>%
  select(participant, group, index, n) %>%
  separate(index, into = c("verb", "similarity"), sep = "(?<=.)(?=[A-Z])")