数据框之间的备用空列

时间:2019-03-27 14:48:11

标签: r dataframe

我有这个df

df = data.frame(aa = letters[1:5],
                bb = letters[1:5],
                cc = letters[1:5],
                dd = letters[1:5])
df2 = c('ee', 'ff', 'gg')
df[df2] = NA

我想要这个输出:

ee  aa  bb  ff  cc  dd  gg
NA  a   a   NA  a   a   NA
NA  b   b   NA  b   b   NA
NA  c   c   NA  c   c   NA
NA  d   d   NA  d   d   NA
NA  e   e   NA  e   e   NA

是否有一种优雅的方法来代替:

df = df[,c('ee', 'aa', 'bb', 'ff', 'cc', 'dd', 'gg')] ??

2 个答案:

答案 0 :(得分:2)

这里是一种选择。根据输入/输出,我们需要在2列的每个块内有交替的列,创建一个列名称为矩阵'm1'的矩阵,split由矩阵的col串联起来,每个{{ 1}}元素与'df2'元素之一一起以指定顺序('un1')创建列名称的向量。使用它,创建了NA的“ data.frame”(通过list路由)并将“ df”列的值分配给该值。

matrix

或者另一个选择是m1 <- matrix(names(df), 2, 2) un1 <- c(unlist(Map(c, df2[seq_len(nrow(m1))], split(m1, col(m1)))), df2[length(df2)]) dfN <- as.data.frame(matrix(NA, ncol =length(un1), nrow = nrow(df), dimnames = list(NULL, un1))) dfN[names(df)] <- df dfN # ee aa bb ff cc dd gg #1 NA a a NA a a NA #2 NA b b NA b b NA #3 NA c c NA c c NA #4 NA d d NA d d NA #5 NA e e NA e e NA 中的add_column。我们基于“ k”(第2列的块)将tibble的数据集放入split的{​​{1}}中,遍历list和{{1 }}与data.frame,在开始(list)处添加列,将其转换为单个data.frame(list),然后在末尾添加

map2

答案 1 :(得分:2)

如果空列的名称无关紧要,那么您也可以使用for循环。这将导致所需的数据框名为df2

df = data.frame(aa = letters[1:5],
                bb = letters[1:5],
                cc = letters[1:5],
                dd = letters[1:5])
df2 = NA

for (i in 1:(ncol(df) / 2)) {
  df2 <- data.frame(df2, df[, (i*2-1):(i*2)], NA)
}

以后可以根据需要添加列名

colnames(df2)[seq(1,ncol(df2),3)] <- c('ee', 'ff', 'gg')