Преобразование данных, сохраненных в формате с разделителями-запятыми, в формат с фиксированной шириной без пакета - PullRequest
1 голос
/ 08 мая 2019

У меня есть файл данных, сохраненный в формате с разделителями-запятыми. Тем не менее, он должен быть преобразован в формат строки с фиксированной шириной. Я знаю, что там есть пакет gdata. Однако из-за некоторых технических ограничений я не могу установить пакет. Без пакета единственный известный мне подход - использовать sprintf, указав формат. Тем не менее, у меня есть более 100 переменных. Поэтому очень утомительно писать формат для каждой переменной. Может ли кто-нибудь помочь мне решить эту проблему? Любая помощь будет оценена.

Пример приведен ниже.

x<-data.frame(matrix(c("N",27,"P",3,"C","A","A","B","C","A","B","B","D","C"),nrow=1))

Ширина первых 4 переменных равна 2,3,2,2, а следующие переменные равны 1. Результат, который я хочу получить, должен выглядеть так:

N 27 P 3 CAABCABBDC

Ответы [ 2 ]

2 голосов
/ 08 мая 2019

Жаль, что вы не можете использовать gdata. вы можете вставить cols вместе по факту

x<-data.frame(matrix(c("N",27,"P",3,"C","A","A","B","C","A","B","B","D","C"),nrow=1))

cols <-5:ncol(x) 
x$newccol <- apply( x[ ,cols] , 1 , paste , collapse = "" )
x[ ,cols ] <- NULL
1 голос
/ 08 мая 2019

Вот еще 2 возможных подхода, предполагающих, что предоставляются только первые N-1 фиксированной ширины, а оставшиеся символы всегда свернуты в одну строку:

1) Использование base::substring

s <- "N27P3CAABCABBDC"
l <- c(2L,3L,2L,2L)
l <- c(l, nchar(s) - (sum(l) - length(l)) + 1L)
start <- c(1L, head(cumsum(l - 1L) + 1L, -1L))
stop <- cumsum(l - 1L)
paste(substring(s, start, stop), collapse=" ")

2) с использованием base::gsub

s <- "N27P3CAABCABBDC"
l <- c(2L,3L,2L,2L)
p <- paste(
    lapply(c(l - 1L, nchar(s) - sum(l-1L)), function(n) sprintf("([[:alnum:]]{%d})", n)),
    collapse="")
r <- paste(
    paste0("\\", seq_len(length(l)+1L)),
    collapse=" ")
gsub(p, r, s)

Пожалуйста, дайте мне знать, если это не удастся для крайних случаев.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...