重复R中数据框中固定行数的值

时间:2016-02-27 07:37:05

标签: r dataframe row repeat

我有一个数据框 DF1 ,包含168个文件名:

DF1$FileName <- c("File1.csv", "File2.csv",..... "File168.csv")

使用:

filez <- NULL
for (i in 1:168){
     filez[i] <- paste0("file", i, ".csv", sep="")
}
filesz <- as.data.frame(filez)

我有另一个数据框 DF2 ,如下所示:

DF2$RowNumber <- as.data.frame(rep(c(1:512000), times = 168, length.out = NA, each = 1))

这意味着DF2有一列“RowNumber”,其中重复数字1到512000的168次(即总共86016000行)。

我想做的是:

  1. 选择一个文件名(一次一个) - &gt; DF1 $文件名[I]

  2. 然后在DF2 $ FileName

  3. 中重复粘贴1到512000
  4. 重复上述步骤,直至所有已填写的86016000行

  5. 最终结果如下:

    DF2
    RowNumber     FileName
    1             File1.txt    
    2             File1.txt
    3             File1.txt
    .             .
    .             .
    .             .
    .             .
    512000        File1.txt
    1             File2.txt
    2             File2.txt
    3             File2.txt
    .             .
    .             .
    512000        File2.txt
    1             File3.txt
    2             File3.txt
    3             File3.txt
    .             .
    .             .
    512000        File3.txt
    .             .
    .             .
    512000        File167.txt
    1             File168.txt
    2             File168.txt
    3             File168.txt
    .             .
    .             .
    512000        File168.txt
    

    我试过这个,但我知道导致系统挂起的逻辑错误:

    for (i in 1:nrow(m)){
        while(m$RowNumber[i] != 512000) {m$FileName[i] <- filez[[i]]}
    }
    

    有人可以建议我更好,更轻松地解决我的问题吗?

    我确信R会有一些包来执行这样的操作,但我不知道哪一个。

2 个答案:

答案 0 :(得分:1)

在这种情况下,不需要for循环。您可以使用专门设计的功能,例如:

基础R的

1) expand.grid

filenames <- paste0("file", 1:168, ".csv")
rownumbers <- 1:512000

d <- expand.grid(rownumbers = rownumbers, filenames = filenames)

给出:

> head(d)
  rownumbers filenames
1          1 file1.csv
2          2 file1.csv
3          3 file1.csv
4          4 file1.csv
5          5 file1.csv
6          6 file1.csv

2) data.table 包中的CJ(交叉连接)功能:

library(data.table)
d <- CJ(rownumbers = rownumbers, filenames = filenames)

会给你相同的结果。

3) tidyr 包中的crossing函数:

library(tidyr)
d <- crossing(rownumbers = rownumbers, filenames = filenames)

也会给你相同的结果。

答案 1 :(得分:1)

最简单的方法是使用整数除法:

for(i in 1:nrow(m)) {
    filenum = 1+floor((i-1)/512000)
    filename = paste0("File",filenum,".txt")
    ## instead of : m$FileName[i]=filenum , use:
    m$FileName[i] = filename  ## it works!
}

希望这有帮助