Есть ли способ переместить все остальные строки в столбце в новый столбец в R? - PullRequest
1 голос
/ 16 апреля 2020

Задача: у меня есть столбец, в котором есть несколько строк. Например, первый ряд - «Название фрукта», а второй - «Цвет фрукта», и он повторяется для другого фрукта. Я хочу захватить каждую вторую строку (Цвет фруктов) и создать новый столбец. В исходном столбце остаются только названия фруктов

library(tidyverse)
df_before <- tribble(~Singlecolumn,"Apple","Red","Banana","Yellow","Kiwi","Grey","Grapes","Green")
df_before
Singlecolumn
<chr>
Apple               
Red             
Banana              
Yellow              
Kiwi                
Grey                
Grapes              
Green

#I would like to split this like below:
df_after <- tribble(~Column1, ~Column2, "Apple","Red","Banana","Yellow","Kiwi","Grey","Grapes","Green")
df_after

Column1 Column2
Apple   Red         
Banana  Yellow          
Kiwi    Grey            
Grapes  Green

Я уверен, что есть более простой способ сделать это, используя функции из tidyverse, но не смог найти информацию с большим количеством поиска. Был бы признателен за любые указатели. Заранее спасибо!

Ответы [ 3 ]

2 голосов
/ 16 апреля 2020

Более простым вариантом является преобразование в matrix с 2 столбцами и преобразование в data.frame в base R

as.data.frame(matrix(df_before$Singlecolumn, ncol = 2, byrow = TRUE))

Но мы также можем использовать tidyverse, где мы создайте две группы с помощью rep, а затем используйте pivot_wider, чтобы изменить формат с «длинного» на «широкий»

library(dplyr)
library(tidyr)
df_before %>%
  group_by(grp = str_c('Column', rep(1:2, length.out = n()))) %>%
  mutate(rn = row_number()) %>%
  ungroup %>%
  pivot_wider(names_from = grp, values_from = Singlecolumn) %>%
  select(-rn)
# A tibble: 4 x 2
#  Column1 Column2
#  <chr>   <chr>  
#1 Apple   Red    
#2 Banana  Yellow 
#3 Kiwi    Grey   
#4 Grapes  Green  
1 голос
/ 16 апреля 2020

Мы можем использовать векторную переработку логических значений для получения альтернативных данных из df_before.

data.frame(Column1 = df_before$Singlecolumn[c(TRUE, FALSE)], 
           Column2 = df_before$Singlecolumn[c(FALSE, TRUE)])

#  Column1 Column2
#1   Apple     Red
#2  Banana  Yellow
#3    Kiwi    Grey
#4  Grapes   Green
1 голос
/ 16 апреля 2020

Вы можете сделать это, проиндексировав столбцы с нечетными и четными номерами

# dummy data (please provide code to make a reproducible example in the future)
df1 <- data.frame(v1 = c("A", "a", "B", "b", "C", "c"))
# solution 
df2 <- data.frame(
  "col1" = df1[seq(1,length(df1[,1]),2), "v1"], 
  "col2" = df1[seq(2,length(df1[,1]),2), "v1"])

Здесь используется последовательность, чтобы задать вектор целых чисел, разделенных 2, начиная с 1 или 2 до длины оригинала кадр данных с использованием функции seq(), например,

seq(2,length(df1[,1]),2)
## [1] 2 4 6

Затем он передается в строки в квадратных скобках df[rows, columns].

...