как разделить длинную строку на несколько переменных

#r

#r

Вопрос:

У меня есть df, которые содержат длинные строки. Если я хочу разделить ее на разные переменные, как мне это сделать?

пример данных здесь:

 df <- structure(list(tx = c(" [1]          Timepoint                                       EGTMPT      Categorical select one (nominal) 51         Screening", 
" [2]          N/A : O ff-Study                                EGTNA       Categorical yes/no (dichotomous) 3", 
" [3]          Check if Not Done                               EGTMPTND    Categorical yes/no (dichotomous) 3", 
" [4]          Date Performed                                  ECGDT       Date                             11", 
" [5]          Time (24-hour format)                           ECGTM       Time                             5", 
" [6]          O verall ECG Interpretation                     ECGRES      Categorical select one (nominal) 37         Normal"
)), row.names = c(NA, 6L), class = "data.frame")
 

Комментарии:

1. используйте separate из tidyr

Ответ №1:

Кажется, что переменные занимают фиксированное пространство, поэтому, чтобы найти эти пробелы, мы делаем следующее:

Вручную отделите одну строку:

 vars = c(" [1]          ", "Timepoint                                       ", "EGTMPT      ",
         "Categorical select one (nominal) ", "51         ", "Screening")
 

Подсчитайте количество символов в каждой переменной:

 sizes = numeric(length(vars))

for(i in 1:length(vars)){
  sizes[i] = nchar(vars[i])}
 

Кумулятивно суммируйте эти значения и добавьте 1 (начальную точку) в начале:

 sizes = c(1, cumsum(sizes))
 

Результат:

 > sizes
[1]   1  14  62  74 107 118 127
 

Итак, первая переменная переходит с 1-й на 14-ю позицию и т.д. Теперь нам просто нужно вырезать каждую строку в этих местах:

 df2 = character()
for(i in 2:length(sizes)){
  df2 = cbind(df2, apply(df, 1, function(x){substr(x, sizes[i-1], sizes[i])}))}
 

И, наконец, удалите лишние пробелы:

 df2 = gsub(" ", "", df2)
 

Комментарии:

1. Спасибо за предложение. однако оказалось, что это не фиксирует размер столбца в данных. (примерные данные этого не показали), поэтому я думаю заменить " " " " , чтобы я не мог отрезать два пустых места. Есть предложения о том, как этого добиться?

2. Я понял вашу проблему, но не ваше предложение, не могли бы вы перефразировать его, пожалуйста?

3. Ну, вы можете использовать pattern = » {1,}», который является пробелом 1 или более раз, но проблема в том, что есть столбец, разделенный только одним пробелом ( ...(dichotomous) 3... ) , и в то же время строки, которые не должны разделяться, также имеют только один пробел ...Time (24-hour format)... . Итак, насколько мне известно, не существует применимого шаблона для разделения ваших данных. Это созданный вами набор данных? Если да, то вы можете исправить это в момент создания.