R от широкого до длинного изменяет форму с именами столбцов - PullRequest
0 голосов
/ 11 декабря 2018

У меня есть данные в этом формате

A1 A2 B1 B2  C1  C2
10  5 11  5  21  10

И я хочу преобразовать их в:

  1  2
A 10 5
B 11 5
C 21 10

Как я могу сделать это в R?

Ответы [ 3 ]

0 голосов
/ 11 декабря 2018

A data.table решение:

library(data.table)
library(magrittr)
melt(df1, measure.vars = names(df1)) %>%
  .[, c("l", "n") := tstrsplit(variable, "")] %>%
  dcast(l ~ n)

   l  1  2
1: A 10  5
2: B 11  5
3: C 21 10
0 голосов
/ 11 декабря 2018

Тегами к вопросу являются r, reshape и reshape2, поэтому мы показываем решения с использованием каждого из них.

1) xtabs Основным решением R является следующее.

let <- gsub("\\d", "", names(DF))
num <- gsub("\\D", "", names(DF))
tab <- xtabs(unlist(DF) ~ let + num)

предоставление:

> tab
   num
let  1  2
  A 10  5
  B 11  5
  C 21 10

или для фрейма данных:

cbind(let = rownames(tab), as.data.frame.matrix(tab))

предоставление:

  let  1  2
A   A 10  5
B   B 11  5
C   C 21 10

2) изменить форму Другое базовое решение R заключается в следующем.let и num сверху.

varying <- split(names(DF), num)
reshape(DF, dir = "long", varying = varying, v.names = names(varying),
  times = unique(let), timevar = "let")[-4]

, дающие:

    let  1  2
1.A   A 10  5
1.B   B 11  5
1.C   C 21 10

3) reshape2 Использование let и num сверху:

library(reshape2)

dcast(let ~ num, data = data.frame(value = unlist(DF)), value.var = "value")

подача:

  let  1  2
1   A 10  5
2   B 11  5
3   C 21 10

Примечание

Ввод в воспроизводимой форме:

Lines <- "
A1 A2 B1 B2  C1  C2
10  5 11  5  21  10"
DF <- read.table(text = Lines, header = TRUE)
0 голосов
/ 11 декабря 2018

Мы можем gather в формате 'long', затем separate столбец 'key' на два, разделив перед числовой частью, spread его на 'wide' и изменив столбец 'key1' на имена строк

library(tidyverse)
gather(df1) %>%
    separate(key, into = c('key1', 'key2'), sep="(?=\\d)") %>% 
    spread(key2, value) %>% 
    column_to_rownames('key1')
#  1  2
#A 10  5
#B 11  5
#C 21 10

данные

df1 <- structure(list(A1 = 10L, A2 = 5L, B1 = 11L, B2 = 5L, C1 = 21L, 
     C2 = 10L), class = "data.frame", row.names = c(NA, -1L))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...