我有这个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')]
??
答案 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')