как добавить векторы элемент за элементом? - PullRequest
0 голосов
/ 26 сентября 2019

Я должен создать CSV-файл в некотором предопределенном формате.Входные данные выглядят так:

> set.seed(1234)
> indata <- data.frame(id = sample(seq(1, 50, 1), 3),
                     ref = c("ref1", "ref2", "ref3"))

> indata 
  id  ref
1 33 ref1
2  1 ref2
3 12 ref3                   

Выходные данные, которые необходимо сгенерировать:

> outdata <- data.frame(`line#` = rep(c(1,2), nrow(indata), replace = TRUE),
                      `Prod Date`= rep(c(as.Date(Sys.Date(), format = "%d.%m.%Y"), ""), nrow(indata) , replace = TRUE),
                       `Prod Ref` = c("ref1", "", "ref2", "", "ref3", ""))
> outdata
  line.  Prod.Date Prod.Ref
1     1 2019-09-26     ref1
2     2       <NA>         
3     1 2019-09-26     ref2
4     2       <NA>         
5     1 2019-09-26     ref3
6     2       <NA>         

Проблема в том, что последний столбец создается на основе indata$ref.

Это может быть очень простой вещью, но сейчас мне не приходит в голову, как это сделать элегантно.

В основном я хочу оставить одну пустую строку после каждого 'ref'.

Я хотел бы создать столбец 'ref' уже на этапе создания data.frame.Любой изящный способ?

Ответы [ 2 ]

1 голос
/ 26 сентября 2019

Один из способов - создать вектор с помощью rbind ing indata$ref с любым пустым значением

c(rbind(indata$ref, ""))
#[1] "ref1" ""     "ref2" ""     "ref3" "" 

Таким образом, ваш вызов data.frame будет выглядеть так:

data.frame(`line#` = rep(c(1,2), nrow(indata), replace = TRUE),
           `Prod Date`= rep(c(as.Date(Sys.Date(), format = "%d.%m.%Y"), ""), 
                         nrow(indata) , replace = TRUE),
       `Prod Ref` = c(rbind(indata$ref, "")))

#  line.  Prod.Date Prod.Ref
#1     1 2019-09-26     ref1
#2     2       <NA>         
#3     1 2019-09-26     ref2
#4     2       <NA>         
#5     1 2019-09-26     ref3
#6     2       <NA>         

данные

set.seed(1234)
indata <- data.frame(id = sample(seq(1, 50, 1), 3),
                   ref = c("ref1", "ref2", "ref3"), stringsAsFactors = FALSE)
0 голосов
/ 26 сентября 2019

Мы можем использовать tidyverse для создания столбцов

library(dplyr)
library(data.table)
indata %>% 
      select(ref) %>% 
      uncount(2) %>% 
      mutate(Prod.Date = Sys.Date(), line. = rowid(ref)) %>% 
      mutate(Prod.Date = replace(Prod.Date, line.==2, NA), 
             ref = replace(as.character(ref), line. == 2, '')) %>% 
             select(line., Prod.Date, Prod.ref = ref)
#  line.  Prod.Date Prod.ref
#1     1 2019-09-26     ref1
#2     2       <NA>         
#3     1 2019-09-26     ref2
#4     2       <NA>         
#5     1 2019-09-26     ref3
#6     2       <NA>         
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...