2015-01-19 7 views
6

Ho cercato di capirlo per un po 'e ho pensato di chiedere qui.Split camelCase Nome colonna

che ho un frame di dati come il seguente:

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)) 

Il problema con questo frame di dati è che ciascuno contiene due variabili: una variabile i cui valori sono o Reg o Irreg, un'altra i cui valori sono Proto, Int o Distant. Quello che mi piacerebbe fare è dividere queste colonne e rendere il tavolo lungo, preferibilmente usando tidyr. Pensavo di poterlo fare in questo modo.

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

Questo fa quello che voglio fino a separate(). Viene visualizzato un messaggio di errore che dice che i valori non sono stati divisi, ma non ci sono altri suggerimenti sul motivo per cui ciò potrebbe essere. Sono nuovo di regex, quindi ho il sospetto che il problema deve essere lì, ma non riesco a capire quale potrebbe essere la sintassi corretta.

risposta

9

È possibile utilizzare questa regex:

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

Indica la posizione (lunghezza zero) seguito da una lettera maiuscola e preceduta da un carattere.

Il comando:

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

Grazie un milione. – JoeF