преобразование набора данных из строк в столбцы в R - PullRequest
0 голосов
/ 28 октября 2018

Я хочу преобразовать строки набора данных в столбец.

selection  weight
sel1       0.4
sel2       0.5



selection_1   weight_1    selection_2   weight_2
sel1          0.4         sel2          0.6

Я попытался изменить форму, но не уверен, какие параметры использовать.

Возможно ли сделать это преобразование с использованием базыR функции?

Ответы [ 2 ]

0 голосов
/ 28 октября 2018

Это глупо, но работает.

Например, я создам описанный вами кадр данных:

selection <- c('sel1','sel2')
weight <- c(0.4,0.5)
df <- data.frame(selection = selection,weight = weight)

Для начала убедитесь, что переменная selectionТип character, а не factor.

df$selection <- as.character(df$selection)

Чтобы создать список имен для нового кадра данных, мы создадим правильные строки и вставим в индексы.

indices <- sort(c(1:nrow(df),1:nrow(df)))
tags <- c(rbind(rep(names(df)[1],nrow(df)),rep(names(df)[2],nrow(df))))
new_names <- sapply(1:(2*nrow(df)),function(j) paste(tags[j],indices[j],sep="_"))

А вот и клумая часть, написанная как функция.Давайте пройдемся по очереди и добавим новые переменные в пустой фрейм данных.

make_new_df <- function(df) { 
  new_df <- data.frame()
  for (i in (1:length(new_names))) {
    test <- i %% ncol(df)
    if (test == 0) {
      row_index <- floor(i/ncol(df))
      col_index <- ncol(df)
    } else {
      row_index <- floor(i/ncol(df))+1
      col_index <- (i %% ncol(df))
    }
    new_df[1,new_names[i]] <- df[row_index,col_index]
  }
  return(new_df)
}

Давайте проверим, работает ли это для вашего примера:

> make_new_df(df)
  selection_1 weight_1 selection_2 weight_2
1        sel1      0.4        sel2      0.5

Будет работать функция make_new_dfдля входного кадра данных df с любым количеством строк и столбцов, но для него требуется правильная конфигурация для new_names.Предварительное построение кода new_names будет работать для любого количества строк, но только для двух столбцов (таким образом, оно находится за пределами функции).Например, код

selection <- c('sel1','sel2','sel3','sel4')
weight <- c(0.4,0.5,0.6,0.7)
df <- data.frame(selection = selection,weight = weight)
indices <- sort(c(1:nrow(df),1:nrow(df)))
tags <- c(rbind(rep(names(df)[1],nrow(df)),rep(names(df)[2],nrow(df))))
new_names <- sapply(1:(2*nrow(df)),function(j) paste(tags[j],indices[j],sep="_"))
make_new_df(df)

выдает

  selection_1 weight_1 selection_2 weight_2 selection_3 weight_3 selection_4 weight_4
1        sel1      0.4        sel2      0.5        sel3      0.6        sel4      0.7
0 голосов
/ 28 октября 2018

Насколько я знаю, я думаю, вам нужно сначала создать timevar и idvar, чтобы использовать reshape.(Даже если idvar здесь константа.)

df1_wide <- reshape(data = transform(df1,
                                     timevar = seq_len(nrow(df1)),
                                     idvar = 1L),
                    timevar = "timevar",
                    idvar = "idvar",
                    direction = "wide",
                    sep = "_")
df1_wide
#  idvar selection_1 weight_1 selection_2 weight_2
#1     1        sel1      0.4        sel2      0.5

Вы можете отменить выбор idvar с помощью

cols_to_keep <- setdiff(names(df1_wide), "idvar")
df1_wide[cols_to_keep]
...