Tengo un problema para agregar una tabla de registros con una condición particular. por ejemplo, tengo este tipo de mesa

  id word count 
1  1  aa    2 
2  2  bb    3 

Luego, quiero cambiar y agregar un número en la columna de identificación con datos similares para otra columna como esta

  id  word count 
1 100  aa    2 
2 101  aa    2 
3 102  aa    2 
4 103  aa    2 
5 200  bb    3 
6 201  bb    3 
7 202  bb    3
8 203  bb    3

La columna de identificación debe agregarse con 2 dígitos detrás y luego agregar un número recursivo después sin cambiar otros datos de la columna. Suponiendo que tengo mil registros, me pregunto cómo hacer que esto suceda.

0
SongJL 15 ago. 2020 a las 20:38

2 respuestas

La mejor respuesta

No queda del todo claro a partir de la descripción. Según el resultado esperado, una opción es crear una columna list haciendo un bucle sobre la 'id', obtener la seq uencia después de multiplicar por '4' y luego unnest la {{ Columna X3}}

library(dplyr)
library(purrr)
library(tidyr)
df1 %>% 
    mutate(id = map(id*100, seq, length.out = 4)) %>% 
    unnest(c(id))
# A tibble: 8 x 3
#     id word  count
#  <dbl> <chr> <int>
#1   100 aa        2
#2   101 aa        2
#3   102 aa        2
#4   103 aa        2
#5   200 bb        3
#6   201 bb        3
#7   202 bb        3
#8   203 bb        3

O otra opción es replicar las filas (uncount), agrupadas por 'palabra', modificar la 'id'

df1 %>%
    uncount(4) %>% 
    group_by(word) %>% 
    mutate(id = seq(100 * first(id), length.out = n()))

Datos

df1 <- structure(list(id = 1:2, word = c("aa", "bb"), count = 2:3), 
class = "data.frame", row.names = c("1", 
"2"))
1
akrun 15 ago. 2020 a las 19:23

Pruebe la siguiente función base R.
Se repite (lapply) sobre la columna 'id' creando un vector como el de la pregunta y luego colocando las otras columnas en orden en un data.frame, luego combina (rbind) todos estos df en el valor de retorno.

fun <- function(x, n = 3){
  cols <- grep('id', names(x), invert = TRUE)
  out <- lapply(x[['id']], function(i){
    y <- sprintf(paste0(i, "%02d"), c(0L, seq.int(n)))
    y <- data.frame(id = y)
    for(j in cols) y[[j]] <- x[i, j]
    y
  })
  out <- do.call(rbind, out)
  row.names(out) <- NULL
  out
}

fun(df1)
#   id V2 V3
#1 100 aa  2
#2 101 aa  2
#3 102 aa  2
#4 103 aa  2
#5 200 bb  3
#6 201 bb  3
#7 202 bb  3
#8 203 bb  3

Datos

df1 <- read.table(text = "
  id word count 
1  1  aa    2 
2  2  bb    3 
", header = TRUE)
1
Rui Barradas 15 ago. 2020 a las 18:08