R запись двоичных данных - PullRequest
3 голосов
/ 21 июня 2020

У меня есть три больших вектора одинаковой размерности. Мне нужно записать их в двоичный файл в определенном порядке: два целых числа, за которыми следует двойное. Пример:

a <- c(1,2,3,4) #integers
b <- c(5,6,7,8) #integers
d <- c(1.32421, 1.42342134123,21.4123412361,1.123412346) #doubles
# desired order:
# 1, 5, 1.32421, 2, 6, 1.42342134123, 3, 7, 21.4123412361, 4, 8, 1.12344112346

Я бы хотел сделать это без использования al oop. Является ли это возможным? Это мой фактический код для этого примера:

con_ <- "a"
file.create(con_)
con <- file(con_,"wb")
for(i in seq(1,length(a))){
  ve <- c(a[i],b[i])
  writeBin(ve,con, size = 4)
  writeBin(d[i],con, size = 8)
}

Ответы [ 4 ]

1 голос
/ 21 июня 2020

Вы можете rbind векторы, чтобы получить векторы в желаемом порядке.

c(rbind(a, b, d))
#Similar to
#c(t(cbind(a, b, d)))

#[1]  1.00  5.00  1.32  2.00  6.00  1.42  3.00  7.00 21.41  4.00  8.00  1.12

Обратите внимание, что вы можете иметь данные только одного класса в векторе. Итак, в этом примере все они превращаются в числа c.

1 голос
/ 21 июня 2020

Мы можем сделать это с помощью order, и он также должен работать, когда длины не совпадают

c(a, b, d)[order(c(seq_along(a), seq_along(b), seq_along(d)))]
#[1]  1.000000  5.000000  1.324210  2.000000  6.000000  1.423421  3.000000  7.000000 21.412341  4.000000  8.000000  1.123412
0 голосов
/ 22 июня 2020

Это работа spintf:

decimals <- nchar(d) - nchar(floor(d)) - 1

sprintf(paste0("%i, %i, ", "%.", decimals, "f"), a, b, d)

[1] "1, 5, 1.32421"       "2, 6, 1.42342134123" "3, 7, 21.4123412361"
[4] "4, 8, 1.123412346"  

Если вам нужен результат в виде вектора длины = длина (a) + длина (b) + длина (d):

unlist(strsplit(sprintf(paste0("%i,%i,", "%.", decimals, "f"), a, b, d), ","))
 [1] "1"             "5"             "1.32421"       "2"            
 [5] "6"             "1.42342134123" "3"             "7"            
 [9] "21.4123412361" "4"             "8"             "1.123412346" 

Вы можете использовать "%s" (т.е. sprint("%s, %s, %s", a, b, d)) вместо "%i" и "%f", если вы обрабатываете элементы как символы.

0 голосов
/ 21 июня 2020

Вы можете создать 1 вектор из этих 3:

list(a, b, d) %>% 
  purrr::transpose() %>%
  unlist()

, но тогда этот вектор будет числовым c:

[1]  1.000000  5.000000  1.324210  2.000000  6.000000  1.423421  3.000000  7.000000
[9] 21.412341  4.000000  8.000000  1.123412
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...