amisos55
amisos55

Reputation: 1979

writing out .dat file in r

I have a dataset looks like this:

ids <- c(111,12,134,14,155,16,17,18,19,20)
scores.1 <- c(0,1,0,1,1,2,0,1,1,1)
scores.2 <- c(0,0,0,1,1,1,1,1,1,0)

data <- data.frame(ids, scores.1, scores.1)

> data
   ids scores.1 scores.1.1
1  111        0          0
2   12        1          1
3  134        0          0
4   14        1          1
5  155        1          1
6   16        2          2
7   17        0          0
8   18        1          1
9   19        1          1
10  20        1          1

ids stands for student ids, scores.1 is the response/score for the first question, and scores.2 is the response/score for the second question. Student ids vary in terms of the number of digits but scores always have 1 digit. I am trying to write out as .dat file by generating some object and use those in write.fwf function in gdata library.

item.count <- dim(data)[2] - 1 # counts the number of questions in the dataset

write.fwf(data, file = "data.dat", width = c(5,rep(1, item.count)), 
          colnames = FALSE, sep = "")

I would like to separate the student ids and question response with some spaces,so I would like to use 5 spaces for students ids and to specify that I used width = c(5, rep(1, item.count)) in write.fwf() function. However, the output file looks like this having the spaces at the left side of the student ids

  11100
   1211
  13400
   1411
  15511
   1622
   1700
   1811
   1911
   2011

rather than at the right side of the ids.

  111 00
   12 11
  134 00
   14 11
  155 11
   16 22
   17 00
   18 11
   19 11
   20 11

Any recommendations?

Thanks!

Upvotes: 2

Views: 1403

Answers (2)

amisos55
amisos55

Reputation: 1979

with @akrun's help, this gives what I wanted:

library(dplyr)
library(tidyr)
data %>% 
    unite(scores, starts_with('scores'), sep='')

write.fwf(data, file = "data.dat", 
          width = c(5,item.count), 
          colnames = FALSE, sep = " ")

in the .dat file, the dataset looks like this below:

  111 00
   12 11
  134 00
   14 11
  155 11
   16 22
   17 00
   18 11
   19 11
   20 11

Upvotes: 1

akrun
akrun

Reputation: 887118

We can use unite to unite the 'score' columns into a single one and then use write.csv

library(dplyr)
library(tidyr)
data %>% 
    unite(scores, starts_with('scores'), sep='')

Upvotes: 1

Related Questions