【问题标题】:Adding multiple columns in between columns in a data frame using a For Loop使用 For 循环在数据框中的列之间添加多列
【发布时间】:2021-02-01 21:38:43
【问题描述】:

输出数据 (df)

Store.No  Task 
    1      70
    2      50
    3      20

我试图通过使用其位置而不是名称在“任务”列之后添加 53 列。然后我希望列名从 1 开始,以数字 53 结束,行中为 0。此示例中的行转到第 3 行,但它可能会有所不同,因此可以使用 nrow 函数来指定行数而不是硬编码

输出数据-期望的结果

    Store.No  Task  1  2  3  4  5  6  7  8  9  10 ...53
       1      70    0  0  0  0  0  0  0  0  0  0
       2      50    0  0  0  0  0  0  0  0  0  0
       3      20    0  0  0  0  0  0  0  0  0  0

使用的代码

x <- 1
y <- 0

for (i in 1:53){

 outputdata <- add_column(outputdata, x = 0, .after = Fo+y)
 y <- y + 1
 x <- x + 1

}

我得到的错误是列被称为 x,x.1,x.2,x.3,x.4...x.53。而不是 1,2,3,4...53...不太清楚为什么会这样

我对 R 还是很陌生,所以有一种更有效的方法可以做到这一点,请告诉我

非常感谢

【问题讨论】:

    标签: r dataframe for-loop match


    【解决方案1】:

    您不需要循环来执行此操作:

    as.data.frame(cbind(df, matrix(0, nrow = nrow(df), ncol = 53)))
    
     Store.No Task Third Fourth 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
    1        1   70     4      7 0 0 0 0 0 0 0 0 0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0
    2        2   50     5      8 0 0 0 0 0 0 0 0 0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0
    3        3   20     6      9 0 0 0 0 0 0 0 0 0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0
      26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
    1  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0
    2  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0
    3  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0
    
    1. matrix 将创建一个 53 列和 3 行的矩阵,其中填充有0

    2. cbind 会将此矩阵添加到数据的末尾

    3. as.data.frame 会将其转换为数据框

    更新

    要按位置插入这些零列,您可以将df 分为两部分:df[, 1:2] 是第一列和第二列,而df[,3:ncol(df)] 是数据框的第三列。

    as.data.frame(cbind(df[,1:2], matrix(0, nrow = nrow(df), ncol = 53), df[,3:ncol(df)))
    
    Store.No Task 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
    1        1   70 0 0 0 0 0 0 0 0 0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0
    2        2   50 0 0 0 0 0 0 0 0 0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0
    3        3   20 0 0 0 0 0 0 0 0 0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0
      30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 Third Fourth
    1  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0     4      7
    2  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0     5      8
    3  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0     6      9
    

    add_column

    或者,您可以使用 tibble 包中的 add_column 函数,就像您在帖子中使用 .after 参数插入到第二列之后一样:

    library(tibble)
    
    tibble::add_column(df, as.data.frame(matrix(0, nrow = nrow(df), ncol = 53)), .after = 2)
    

    注意:此函数将修复列名,以便在任何以数字开头的列名之前添加“V”。所以1 会变成V1


    数据

    df <- data.frame(Store.No = 1:3,
                     Task = c(70, 50, 20),
                     Third = 4:6,
                     Fourth = 7:9)
    

    【讨论】:

    • 这将如何处理超过 3 行?行号每次都可以改变...通常从 1400 行开始
    • 更改nrow = 1400
    • 难道没有办法使用 nrow 函数而不是指定行数吗?
    • 很可能,但您的帖子中未提供有关行数如何/何时更改的信息。您可以通过指定 nrow = nrow(df) 使其更通用。
    • 抱歉,我已经编辑了原帖
    猜你喜欢
    • 2022-07-19
    • 1970-01-01
    • 1970-01-01
    • 2022-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-26
    • 2023-03-11
    相关资源
    最近更新 更多