Вот один пример таблицы:

data.frame(A = c(1,2,3),
  B = c(2,4,2), 
  C = c(5,2,1), 
  class = c('apple', 'pear', 'banana'))

A   B   C   class
1   2   5   apple   
2   4   2   pear    
3   2   1   banana

Окончательный результат, который я хочу получить:

name  apple  pear  banana
A     1      2     3    
B     2      4     2    
C     5      2     1    

Я пробовал оба gather() и spread() из пакета tidyr, но они были не так, как я хочу. К вашему сведению, размер исходной таблицы составляет 1000 * 150, поэтому мы будем очень благодарны за репродуктивный путь.

0
Y. Z. 20 Авг 2018 в 18:48

4 ответа

Лучший ответ

Вот базовое решение R с использованием транспонирования:

df <- data.frame(A,B,C, class, stringsAsFactors=FALSE)
out <- data.frame(t(df[c("A", "B", "C")]))
out <- cbind(names(df)[1:3], out)
names(out) <- c("name", df$class)
out

  name apple pear banana
A    A     1    2      3
B    B     2    4      2
C    C     5    2      1

Демо

2
Tim Biegeleisen 20 Авг 2018 в 15:59

Использование gather и spread даст вам желаемый результат:

> library(tidyr)
> df1 %>% gather(cols, values, A:C) %>% 
    spread(class, values)
  cols apple banana pear
1    A     1      3    2
2    B     2      2    4
3    C     5      1    2

Вы даже можете использовать melt и dcast из пакета reshape2

> library(reshape2)
> dcast(melt(df1), variable ~ class)
Using class as id variables
  variable apple banana pear
1        A     1      3    2
2        B     2      2    4
3        C     5      1    2
2
Jilber Urbina 20 Авг 2018 в 15:54

Я предлагаю использовать

t()

Функция транспонирования.

Позволять

df <- data.frame(A = c(1,2,3),
B = c(2,4,2), 
C = c(5,2,1), 
class = c('apple', 'pear', 'banana'))

Перед транспонированием удалите столбец, который вы хотите использовать в качестве имени столбца в конечном кадре данных. В этом случае столбец 4,

new_colnames <- df[,4]
df <- df[,-4]

Затем перенести df,

df <- t(df)

Затем установите colnames в new_colnames.

colnames(df) <- new_colnames
0
user9609476 20 Авг 2018 в 16:12

Преобразование столбца класса в имена строк, транспонирование, преобразование во фрейм данных и преобразование имен строк в столбец name.

library(magrittr)
library(tibble)

DF %>% 
   column_to_rownames("class") %>% 
   t %>% 
   as.data.frame %>% 
   rownames_to_column("name")

Давая :

  name apple pear banana
1    A     1    2      3
2    B     2    4      2
3    C     5    2      1
2
G. Grothendieck 20 Авг 2018 в 15:58
51934329