Объединение первой и второй строк в текстовом файле в 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)