#r #dataframe
Вопрос:
Мои данные.рамка
structure(list(a = c("12", "asd", "zxc", "123"), b = c("45",
"qwe", "curced", "64"), c = c("78", "tyu", "454", "76")), class = "data.frame", row.names = c(NA,
-4L))
Я хотел бы добавить один столбец под другим и назначать и назначать группы столбцам. Например, для первого столбца «1», для второго — «2», для третьего — «3» и т. Д. Я знаю, как переносить столбцы один под другим, но я не знаю, как назначать им группы
То, что я хочу получить:
Ответ №1:
Базовый подход R с использованием Map
result <- do.call(rbind, Map(data.frame, a = df, group = seq_along(df)))
Другой подход, использующий tidyverse
функции.
library(dplyr)
library(tidyr)
df %>%
pivot_longer(cols = everything(), names_to = 'group') %>%
mutate(group = match(group, unique(group))) %>%
arrange(group)
# group value
# <int> <chr>
# 1 1 12
# 2 1 asd
# 3 1 zxc
# 4 1 123
# 5 2 45
# 6 2 qwe
# 7 2 curced
# 8 2 64
# 9 3 78
#10 3 tyu
#11 3 454
#12 3 76
Комментарии:
1. не говорите мне, как это можно сделать в парах. эти 1-2,1-3 и так далее?
2. Я имею в виду комбинацию столбцов
3. Извините, ваш пример и ожидаемый результат не содержали таких комбинаций. Я добавил ответ, основанный на том, что объясняется в вопросе.
Ответ №2:
Если я правильно понял, здесь два разных подхода
library(tidyverse)
1-) Сравнение имени с векторными буквами
Здесь я сравниваю каждую name
из них с их положением в алфавите, используя вектор letters
df %>%
pivot_longer(cols = everything()) %>%
rowwise() %>%
mutate(group = which(name == letters))
2-) Создайте вспомогательный фрейм данных.
В этой альтернативе a создайте фрейм данных с переменными name
и group
df %>%
pivot_longer(cols = everything()) %>%
left_join(
tibble(
name = c("a","b","c"),
group = 1:3
)
)
# A tibble: 12 x 3
name value group
<chr> <chr> <int>
1 a 12 1
2 b 45 2
3 c 78 3
4 a asd 1
5 b qwe 2
6 c tyu 3
7 a zxc 1
8 b curced 2
9 c 454 3
10 a 123 1
11 b 64 2
12 c 76 3