Повернуть фрейм данных с заголовком - PullRequest
4 голосов
/ 28 марта 2020

Как мы можем изменить или повернуть фрейм данных так, как показано в примере ниже (Первая строка представляет заголовок)?

State1 Customer1 State2 Customer2 State3 Customer3 State4 Customer4
Us     1980      FR     274       DE     641       UK     521

Скрипт:

State <- c("US", "FR","DE", "UK")
Customer <- c(1980, 274, 641, 521)

Table <- data.frame(State, Customer)

Ответы [ 4 ]

2 голосов
/ 28 марта 2020

A base way

df <- cbind.data.frame(split(Table, 1:nrow(Table)))
names(df) <- sub("(\\d+)\\.(\\D+)", "\\2\\1", names(df))

#   State1 Customer1 State2 Customer2 State3 Customer3 State4 Customer4
# 1     US      1980     FR       274     DE       641     UK       521

Другой вариант использования purrr::imap_dfc

library(purrr)
imap_dfc(split(Table, 1:nrow(Table)), ~ set_names(.x, paste0, .y))

#   State1 Customer1 State2 Customer2 State3 Customer3 State4 Customer4
# 1     US      1980     FR       274     DE       641     UK       521

Данные

Table <- structure(list(State = structure(c(4L, 2L, 1L, 3L), .Label = c("DE", 
"FR", "UK", "US"), class = "factor"), Customer = c(1980, 274, 
641, 521)), class = "data.frame", row.names = c(NA, -4L))
1 голос
/ 30 марта 2020

Опция, использующая data.table:

library(data.table)
DT <- fread("State1 Customer1 State2 Customer2 State3 Customer3 State4 Customer4
Us     1980      FR     274       DE     641       UK     521")
melt(DT, measure.vars=patterns("State", "Customer"), value.name=c("State","Customer"))[, 
    variable := NULL][]

, вывод:

   State Customer
1:    Us     1980
2:    FR      274
3:    DE      641
4:    UK      521
1 голос
/ 28 марта 2020

С base:

  res<-read.table(text=paste0(State," ",Customer,collapse=" "),sep=" ")
  names(res)[seq(1,ncol(res),2)] <- paste0("state",1:4)
 names(res)[-seq(1,ncol(res),2)] <-paste0("customer_",1:4)

Результат:

 res
      state1 customer_1 state2 customer_2 state3 customer_3 state4 customer_4
    1     US       1980     FR        274     DE        641     UK        521
0 голосов
/ 28 марта 2020

Я бы попробовал что-то вроде:

Table2<-cbind(Table[1,],Table[2,],Table[3,],Table[4,])

names(Table2)<-make.names(names = names(Table2), unique = T)

вывод:

> Table2

  State Customer State.1 Customer.1 State.2 Customer.2 State.3 Customer.3
1    US     1980      FR        274      DE        641      UK        521

РЕДАКТИРОВАТЬ:

Или более общий подход, непосредственно из векторов State и Custumer :

table<-as.data.frame(t(c(rbind(State, Customer))))
colnames(table)<-rep(c("State", "Customer"),ncol(table)/2)

names(table)<-make.names(names = names(table), unique = T)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...