Объединение первой и второй строк в текстовом файле в R

У меня есть грязный набор данных, который имеет 2 строки информации, которая принадлежит 1. Я хотел бы взять вторую строку и шлепнуть ее по концу первой строки и создать новые столбцы в процессе.

For example, I would like:

       COL1      COL2
1     name1    score1
2    state1   rating1
3     name2    score2
4    state2   rating2

To become:

      COL1      COL2     COL3      COL4
1    name1    score1   state1   rating1
2    name2    score2   state2   rating2

Есть ли что-нибудь упрощенное в Хэдливерс для этого?

4 ответа

Вы должны разделить фрейм данных на два фрейма данных: один содержит четные строки, а другой - нечетные. Внимание: если есть нечетное количество строк, последняя строка будет содержать NA в новых добавленных столбцах.

Нечетные строки: df[seq(1, nrow(df), 2), ]

Четные строки: df[seq(2, nrow(df), 2), ]

Следующим шагом является cbind их:

df_new = cbind(df[seq(1, nrow(df), 2), ], df[seq(2, nrow(df), 2), ])

Последний шаг должен быть переименован в столбцы:

colnames(df_new) = c("COL1", "COL2", "COL3", "COL4")

Я бы сделал это используя unite() а также separate() от тидыр и lead() от dplyr.

library(dplyr)
library(tidyr)

df <- tribble(
~COL1,      ~COL2,
"name1",    "score1",
"state1",   "rating1",
"name2",    "score2",
"state2",   "rating2"
)


df %>% 
  unite(old_cols, COL1, COL2) %>%
  mutate(new_cols = lead(old_cols)) %>%
  filter(row_number() %% 2 == 1) %>%
  separate(old_cols, into = c("COL1", "COL2")) %>%
  separate(new_cols, into = c("COL3", "COL4"))

#> # A tibble: 2 x 4
#>    COL1   COL2   COL3    COL4
#> * <chr>  <chr>  <chr>   <chr>
#> 1 name1 score1 state1 rating1
#> 2 name2 score2 state2 rating2

С base Rмы могли бы использовать переработку логического вектора для подстановки строк в list а потом cbind

setNames(do.call(cbind, list(df[c(TRUE, FALSE),], 
      df[c(FALSE, TRUE),])), paste0("COL", 1:4))
#   COL1   COL2   COL3    COL4
#1 name1 score1 state1 rating1
#3 name2 score2 state2 rating2

Вот dplyr решение.

library(dplyr)

dt2 <- dt %>%
  mutate(Group = rep(1:2, times = nrow(.)/2)) %>%
  split(.$Group) %>%
  bind_cols() %>%
  select(-starts_with("Group")) %>%
  setNames(paste0("COL", 1:ncol(.)))
dt2
   COL1   COL2   COL3    COL4
1 name1 score1 state1 rating1
2 name2 score2 state2 rating2

Или мы также можем использовать purrr пакет с dplyr пакет.

library(dplyr)
library(purrr)

dt2 <- dt %>%
  mutate(Group = rep(1:2, times = nrow(.)/2)) %>%
  split(.$Group) %>%
  map_dfc(. %>% select(-Group)) %>%
  setNames(paste0("COL", 1:ncol(.)))
dt2
   COL1   COL2   COL3    COL4
1 name1 score1 state1 rating1
2 name2 score2 state2 rating2

ДАННЫЕ

dt <- read.table(text = "       COL1      COL2
1     name1    score1
                 2    state1   rating1
                 3     name2    score2
                 4    state2   rating2",
                 header = TRUE, stringsAsFactors = FALSE)
Другие вопросы по тегам