добавьте один столбец под другим и назначьте ему группу

#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