Объединение столбцов в одном наборе данных с R - PullRequest
0 голосов
/ 15 сентября 2018

У меня есть набор данных, подобный следующему:

a  b  c  d  e  f  g  h  i
1  2  3  4  5  6  7  8  9

Я хотел бы сохранить 3 столбца и добавить остальные 6 столбцов под первыми тремя столбцами, например:

a  b  c
1  2  3
4  5  6
7  8  9

1 Ответ

0 голосов
/ 15 сентября 2018

Мы можем сделать

n <- 3
do.call(rbind, lapply(split.default(df1, f = gl(
  n = n, k = n, length = ncol(df1)
)), setNames, nm = names(df1)[1:n]))
#  a b c
#1 1 2 3
#2 4 5 6
#3 7 8 9

Объяснение

Первый шаг - разделить ваши данные на каждые три столбца.Мы используем split.default() в сочетании с gl() для этой задачи.gl() определяет группировку.

gl(n = n, k = n, length = ncol(df1))
#[1] 1 1 1 2 2 2 3 3 3
#Levels: 1 2 3

Результатом split.default является список

split.default(df1, f = gl(n = n, k = n, length = ncol(df1)))
#$`1`
#  a b c
#1 1 2 3
#
#$`2`
#  d e f
#1 4 5 6
#
#$`3`
#  g h i
#1 7 8 9

Чтобы использовать rbind, столбцы должны иметь одинаковые имена.Поэтому я использую lapply() и setNames, чтобы переименовать все столбцы в names(df1)[1:n], то есть

lapply(split.default(df1, f = gl(n = n, 
                                 k = n,
                                 length = ncol(df1))), 
       setNames, nm = names(df1)[1:n])

Наконец, мы вызываем do.call(rbind, ...), чтобы объединить три набора данных в один.

данные

df1 <- structure(list(a = 1L, b = 2L, c = 3L, d = 4L, e = 5L, f = 6L, 
    g = 7L, h = 8L, i = 9L), .Names = c("a", "b", "c", "d", "e", 
"f", "g", "h", "i"), class = "data.frame", row.names = c(NA, 
-1L))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...