如何插入缺失的列?

时间:2017-07-26 20:01:53

标签: r dataframe sequence

我的数据框如下所示:

df <- data.frame('2' = -.05, '3' = -.01, '5' = .2)

我想插入另一个标题为“&#39; 4&#39;其值为0,并将其插入正确的位置(第3列)。 最终结果应如下所示:

df <- data.frame('2' = -.05, '3' = -.01, '4' = 0, '5' = .2)

我还需要这个工作给定任何数据框,缺少的列都归档。例如:

df <- data.frame('2' = -.15, '6' = .11)

变为

df <- data.frame('2' = -.05, '3' = 0, '4' = 0, '5' = 0, '6' = .11)

感谢您的任何帮助或建议。

2 个答案:

答案 0 :(得分:1)

我们可以在base R中执行此操作。建议不要使用以数字开头的列名称,因此默认情况下check.names = TRUE中的data.frame,因此当我们创建data.frame时,它会附加一个'X'作为前缀。为避免这种情况,请使用check.names = FALSE

获取“数据”的names,将其转换为numeric,获取range并找到序列

v1 <- Reduce(`:`, range(as.numeric(names(df))))

然后,我们创建一个data.frame,其值为0,列名为“v1”

df2 <- as.data.frame.list(setNames(numeric(length(v1)), v1), check.names = FALSE)

根据'df'

中的列名分配'df2'中的值
df2[names(df)] <- df
df2
#      2     3 4   5
#1 -0.05 -0.01 0 0.2

它可以转换为函数

f1 <- function(dat){
 v1 <- Reduce(`:`, range(as.numeric(names(dat))))
 df2 <- as.data.frame.list(setNames(numeric(length(v1)), v1), 
         check.names = FALSE)
df2[names(dat)] <- df
df2

}

df <- data.frame('2' = -.15, '6' = .11, check.names = FALSE)
f1(df)
#       2 3 4 5    6
# 1 -0.15 0 0 0 0.11

数据

df <- data.frame('2' = -.05, '3' = -.01, '5' = .2, check.names = FALSE)

答案 1 :(得分:0)

我使用了tibbles而不是data.frames,因为它们可以使用数字作为列名(只需要用反引号```来转义它们。

library(tidyverse)

df <- tibble(`2` = -.15, `6` = .11)

fix_tibble <- function(x) {
form <- tibble( `2` = NA_real_,
                `3` = NA_real_,
                `4` = NA_real_,
                `5` = NA_real_,
                `6` = NA_real_)

bind_rows(form, x) %>%
  select(`2`,`3`,`4`,`5`,`6`) %>%
  .[-1,]}

fix_tibble(df)