问题描述
我在添加某些具有特定条件的记录表时遇到问题。 例如,我有这种桌子
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()))