#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
то, что возвращает alist
из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
то, что возвращает alist
из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
то, что возвращает alist
из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. Спасибо вам за ваш ценный ответ. Пожалуйста, ознакомьтесь с моими обновлениями. Это может быть способом решить вашу задачу!