Aquí un pequeño ejemplo de lo que estoy tratando de hacer.

A   B   C   D   E   F   G   H
x1  x2  x3  x4  x5  x6  x7  x8
y1  y2  y3  y4  y5  y6  y7  y8
z1  z2  z3  z4  z5  z6  z7  z8

Para

A   B   CDE FGH  
x1  x2  x3  x6  
x1  x2  x4  x7  
x1  x2  x5  x8  
y1  y2  y3  y7  
y1  y2  y4  y6  
y1  y2  y5  y8  

Solo puedo apuñalar 3 columnas en una con este código

NewData= melt(setDT(Data),measure = list(c(6,7,8)), value.name = "FGH ")

Gracias de antemano

1
Ian.T 5 may. 2020 a las 02:17

2 respuestas

Podemos obtener los datos en formato largo, crear valores separados para c('C', 'D', 'E') y otros valores y obtener los datos en formato ancho.

library(dplyr)
library(tidyr)

df %>%
  pivot_longer(cols = -(A:B)) %>%
  mutate(name = ifelse(name %in% c('C', 'D', 'E'), 'CDE', 'FGH')) %>%
  group_by(name) %>%
  mutate(row = row_number()) %>%
  pivot_wider() %>%
  select(-row)


# A tibble: 9 x 4
#  A     B     CDE   FGH  
#  <chr> <chr> <chr> <chr>
#1 x1    x2    x3    x6   
#2 x1    x2    x4    x7   
#3 x1    x2    x5    x8   
#4 y1    y2    y3    y6   
#5 y1    y2    y4    y7   
#6 y1    y2    y5    y8   
#7 z1    z2    z3    z6   
#8 z1    z2    z4    z7   
#9 z1    z2    z5    z8   

datos

df <- structure(list(A = c("x1", "y1", "z1"), B = c("x2", "y2", "z2"
), C = c("x3", "y3", "z3"), D = c("x4", "y4", "z4"), E = c("x5", 
"y5", "z5"), F = c("x6", "y6", "z6"), G = c("x7", "y7", "z7"), 
H = c("x8", "y8", "z8")), class = "data.frame", row.names = c(NA, -3L))
0
Ronak Shah 5 may. 2020 a las 06:35

Nosotras podemos usar patterns

library(data.table)
melt(setDT(Data), measure = patterns("^[CDE]", "^[FGH]"), 
        value.name = c("CDE", "FGH"))[, variable := NULL][]
2
akrun 4 may. 2020 a las 23:23