Создание массива из двух разных фреймов данных в R

#r #arrays #dataframe #matrix

Вопрос:

У меня есть два фрейма данных ниже:

 c1a <- c("1a","1a","1a")
c1b <- c("1b","1b","1b")
c2a <- c("2a","2a","2a")
c2b <- c("2b","2b","2b")
c3a <- c("3a","3a","3a")
c3b <- c("3b","3b","3b")
df1 <- as.data.frame(rbind(c1a,c2a,c3a))
df2 <- as.data.frame(rbind(c1b,c2b,c3b))
 

Я хочу создать массив с тремя матрицами 2*3, каждая матрица получает свою первую строку из df1 и свою 2-ю строку из df2. что-то вроде,

 , , 1

     [,1] [,2] [,3]
[1,]    1a    1a    1a
[2,]    1b    1b    1b

, , 2

     [,1] [,2] [,3]
[1,]    2a    2a    2a
[2,]    2b    2b    2b

, , 3

     [,1] [,2] [,3]
[1,]    3a    3a    3a
[2,]    3b    3b    3b



array(c(rbind(c1a,c2a),rbind(c1b,c2b)), dim = c(2,3,2))
 

Я не уверен, как получить это для всех строк кадров данных.

Ответ №1:

Мы могли asplit бы разделить набор данных по строкам ( MARGIN = 1 ), использовать Map для rbind соответствующих list элементов и преобразовать list в array с simplify2array

 simplify2array(unname(Map(rbind, asplit(df1, 1), asplit(df2, 1))))
 

-уптут

 , , 1

     V1   V2   V3  
[1,] "1a" "1a" "1a"
[2,] "1b" "1b" "1b"

, , 2

     V1   V2   V3  
[1,] "2a" "2a" "2a"
[2,] "2b" "2b" "2b"

, , 3

     V1   V2   V3  
[1,] "3a" "3a" "3a"
[2,] "3b" "3b" "3b"
 

Или также может связать наборы данных вместе, создав столбец «идентификатор», получить последовательность по «идентификатору» и выполнить group_split то, что возвращает a list из tibble s. Если нам нужно преобразовать в array , измените tibble на data.frame и используйте simplify2array

 library(dplyr)
library(data.table)
bind_rows(df1, df2, .id = 'id') %>%
     mutate(rn = rowid(id), id = NULL) %>% 
     group_split(rn, .keep = FALSE) 
 

Ответ №2:

Обновление: мы могли бы попробовать этот способ:

 df3 <- rbind(df1, df2)
row.names(df3) <- NULL

split(df3[order(df3[,1]),], rep(1:3, each=2))
 

Выход:

 
 #r #arrays #dataframe #matrix



Вопрос:

У меня есть два фрейма данных ниже:
 c1a <- c("1a","1a","1a")
c1b <- c("1b","1b","1b")
c2a <- c("2a","2a","2a")
c2b <- c("2b","2b","2b")
c3a <- c("3a","3a","3a")
c3b <- c("3b","3b","3b")
df1 <- as.data.frame(rbind(c1a,c2a,c3a))
df2 <- as.data.frame(rbind(c1b,c2b,c3b))
 

Я хочу создать массив с тремя матрицами 2*3, каждая матрица получает свою первую строку из df1 и свою 2-ю строку из df2. что-то вроде,

 , , 1

     [,1] [,2] [,3]
[1,]    1a    1a    1a
[2,]    1b    1b    1b

, , 2

     [,1] [,2] [,3]
[1,]    2a    2a    2a
[2,]    2b    2b    2b

, , 3

     [,1] [,2] [,3]
[1,]    3a    3a    3a
[2,]    3b    3b    3b



array(c(rbind(c1a,c2a),rbind(c1b,c2b)), dim = c(2,3,2))
 

Я не уверен, как получить это для всех строк кадров данных.

Ответ №1:

Мы могли asplit бы разделить набор данных по строкам ( MARGIN = 1 ), использовать Map для rbind соответствующих list элементов и преобразовать list в array с simplify2array

 simplify2array(unname(Map(rbind, asplit(df1, 1), asplit(df2, 1))))
 

-уптут

 , , 1

     V1   V2   V3  
[1,] "1a" "1a" "1a"
[2,] "1b" "1b" "1b"

, , 2

     V1   V2   V3  
[1,] "2a" "2a" "2a"
[2,] "2b" "2b" "2b"

, , 3

     V1   V2   V3  
[1,] "3a" "3a" "3a"
[2,] "3b" "3b" "3b"
 

Или также может связать наборы данных вместе, создав столбец "идентификатор", получить последовательность по "идентификатору" и выполнить group_split то, что возвращает a list из tibble s. Если нам нужно преобразовать в array , измените tibble на data.frame и используйте simplify2array

 library(dplyr)
library(data.table)
bind_rows(df1, df2, .id = 'id') %>%
     mutate(rn = rowid(id), id = NULL) %>% 
     group_split(rn, .keep = FALSE) 
 

Ответ №2:

Обновление: мы могли бы попробовать этот способ:

 df3 <- rbind(df1, df2)
row.names(df3) <- NULL

split(df3[order(df3[,1]),], rep(1:3, each=2))
 

Выход:

1`
V1 V2 V3
1 1a 1a 1a
4 1b 1b 1b

#r #arrays #dataframe #matrix

Вопрос:

У меня есть два фрейма данных ниже:

 c1a <- c("1a","1a","1a")
c1b <- c("1b","1b","1b")
c2a <- c("2a","2a","2a")
c2b <- c("2b","2b","2b")
c3a <- c("3a","3a","3a")
c3b <- c("3b","3b","3b")
df1 <- as.data.frame(rbind(c1a,c2a,c3a))
df2 <- as.data.frame(rbind(c1b,c2b,c3b))
 

Я хочу создать массив с тремя матрицами 2*3, каждая матрица получает свою первую строку из df1 и свою 2-ю строку из df2. что-то вроде,

 , , 1

     [,1] [,2] [,3]
[1,]    1a    1a    1a
[2,]    1b    1b    1b

, , 2

     [,1] [,2] [,3]
[1,]    2a    2a    2a
[2,]    2b    2b    2b

, , 3

     [,1] [,2] [,3]
[1,]    3a    3a    3a
[2,]    3b    3b    3b



array(c(rbind(c1a,c2a),rbind(c1b,c2b)), dim = c(2,3,2))
 

Я не уверен, как получить это для всех строк кадров данных.

Ответ №1:

Мы могли asplit бы разделить набор данных по строкам ( MARGIN = 1 ), использовать Map для rbind соответствующих list элементов и преобразовать list в array с simplify2array

 simplify2array(unname(Map(rbind, asplit(df1, 1), asplit(df2, 1))))
 

-уптут

 , , 1

     V1   V2   V3  
[1,] "1a" "1a" "1a"
[2,] "1b" "1b" "1b"

, , 2

     V1   V2   V3  
[1,] "2a" "2a" "2a"
[2,] "2b" "2b" "2b"

, , 3

     V1   V2   V3  
[1,] "3a" "3a" "3a"
[2,] "3b" "3b" "3b"
 

Или также может связать наборы данных вместе, создав столбец "идентификатор", получить последовательность по "идентификатору" и выполнить group_split то, что возвращает a list из tibble s. Если нам нужно преобразовать в array , измените tibble на data.frame и используйте simplify2array

 library(dplyr)
library(data.table)
bind_rows(df1, df2, .id = 'id') %>%
     mutate(rn = rowid(id), id = NULL) %>% 
     group_split(rn, .keep = FALSE) 
 

Ответ №2:

Обновление: мы могли бы попробовать этот способ:

 df3 <- rbind(df1, df2)
row.names(df3) <- NULL

split(df3[order(df3[,1]),], rep(1:3, each=2))
 

Выход:

2`
V1 V2 V3
2 2a 2a 2a
5 2b 2b 2b

#r #arrays #dataframe #matrix

Вопрос:

У меня есть два фрейма данных ниже:

 c1a <- c("1a","1a","1a")
c1b <- c("1b","1b","1b")
c2a <- c("2a","2a","2a")
c2b <- c("2b","2b","2b")
c3a <- c("3a","3a","3a")
c3b <- c("3b","3b","3b")
df1 <- as.data.frame(rbind(c1a,c2a,c3a))
df2 <- as.data.frame(rbind(c1b,c2b,c3b))
 

Я хочу создать массив с тремя матрицами 2*3, каждая матрица получает свою первую строку из df1 и свою 2-ю строку из df2. что-то вроде,

 , , 1

     [,1] [,2] [,3]
[1,]    1a    1a    1a
[2,]    1b    1b    1b

, , 2

     [,1] [,2] [,3]
[1,]    2a    2a    2a
[2,]    2b    2b    2b

, , 3

     [,1] [,2] [,3]
[1,]    3a    3a    3a
[2,]    3b    3b    3b



array(c(rbind(c1a,c2a),rbind(c1b,c2b)), dim = c(2,3,2))
 

Я не уверен, как получить это для всех строк кадров данных.

Ответ №1:

Мы могли asplit бы разделить набор данных по строкам ( MARGIN = 1 ), использовать Map для rbind соответствующих list элементов и преобразовать list в array с simplify2array

 simplify2array(unname(Map(rbind, asplit(df1, 1), asplit(df2, 1))))
 

-уптут

 , , 1

     V1   V2   V3  
[1,] "1a" "1a" "1a"
[2,] "1b" "1b" "1b"

, , 2

     V1   V2   V3  
[1,] "2a" "2a" "2a"
[2,] "2b" "2b" "2b"

, , 3

     V1   V2   V3  
[1,] "3a" "3a" "3a"
[2,] "3b" "3b" "3b"
 

Или также может связать наборы данных вместе, создав столбец "идентификатор", получить последовательность по "идентификатору" и выполнить group_split то, что возвращает a list из tibble s. Если нам нужно преобразовать в array , измените tibble на data.frame и используйте simplify2array

 library(dplyr)
library(data.table)
bind_rows(df1, df2, .id = 'id') %>%
     mutate(rn = rowid(id), id = NULL) %>% 
     group_split(rn, .keep = FALSE) 
 

Ответ №2:

Обновление: мы могли бы попробовать этот способ:

 df3 <- rbind(df1, df2)
row.names(df3) <- NULL

split(df3[order(df3[,1]),], rep(1:3, each=2))
 

Выход:

3`
V1 V2 V3
3 3a 3a 3a
6 3b 3b 3b

Первый ответ: это была первая попытка:
В базе R мы могли бы сначала rbind , а затем подмножество по номерам строк:

 df3 <- rbind(df1, df2)
array1 <- df3[c(1,4),]
array2 <- df3[c(2,5),]
array3 <- df3[c(3,6),]

array1
array2
array3
 

выход:

 array1
    V1 V2 V3
c1a 1a 1a 1a
c1b 1b 1b 1b
> array2
    V1 V2 V3
c2a 2a 2a 2a
c2b 2b 2b 2b
> array3
    V1 V2 V3
c3a 3a 3a 3a
c3b 3b 3b 3b
 

Комментарии:

1. спасибо, однако на самом деле мои фактические наборы данных содержат тысячи строк. Мне нужна петля или что-то в этом роде для них, с чем у меня проблема. Тогда я не могу перебирать строки одну за другой. и мне не нужны три массива. Мне нужен один массив, содержащий несколько матриц.

2. Спасибо вам за ваш ценный ответ. Пожалуйста, ознакомьтесь с моими обновлениями. Это может быть способом решить вашу задачу!