在数据框R中添加带条件的递归数 数据

问题描述

我在添加某些具有特定条件的记录表时遇到问题。 例如,我有这种桌子

  id word count 
1  1  aa    2 
2  2  bb    3 

然后,我想在id列中添加一些数字,并为类似的其他列添加类似数据

  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

id列需要在后面加上2位数字,然后在不更改其他列数据的情况下添加递归数。假设我有上千条记录,我想知道如何做到这一点。

解决方法

尝试以下基本R函数。
它在列lapply上循环('id'),创建一个与问题中的列相似的向量,然后将其他列按顺序排列在data.frame中,然后合并(rbind)所有这些df的返回值。

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

数据

df1 <- read.table(text = "
  id word count 
1  1  aa    2 
2  2  bb    3 
",header = TRUE)
,

从描述中还​​不清楚。根据预期的输出,一种选择是通过循环遍历'id'来创建list列,乘以'4'之后得到seq uence,然后unnest { 1}}列

list

或者另一种选择是复制行(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 ),按'word'分组,修改'id'

uncount

数据

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