как объединить несколько столбцов в один столбец внутри точки с запятой внутри нового столбца в r - PullRequest
0 голосов
/ 09 июня 2018

Я хочу объединить несколько столбцов и создать столбец, содержащий список (или словарь словаря в Python), разделенные точкой с запятой.
По сути, у меня есть этот фрейм данных: (пустые пробелы пропускают значения)

ID  Event Category  Start Time  End Time    Account No.   Dosage  Doctor's_ID
1    Stroke          1/1/2011       
1   Admitted         1/6/2011               24287939                  5487
1   Diagnosed        1/25/2011      
6   Diagnosed        1/1/2011       
6   Drug       A     1/2/2011   1/10/2011                  "high"
6   Drug       B     1/7/2011   1/20/2011   35287930      "medium"
10  Drug       A    1/3/2011    1/6/2011                   "low"
10  Drug       B    1/9/2011    1/13/2011                  "high"
10  Stroke          1/8/2011        

Я хочу создать столбец attribute, который объединит несколько столбцов в столбце и в пределах разделителя точек с запятой.

Выходной файл (может быть текстовым файлом) выглядит:

  ID    Event Category  Start Time  End Time    attributes
    1    Stroke          1/1/2011       
    1   Admitted         1/6/2011               Account No.="24287939"; Doctor's_ID="5487"
    1   Diagnosed        1/25/2011      
    6   Diagnosed        1/1/2011       
    6   Drug       A     1/2/2011   1/10/2011   Dosage="high"
    6   Drug       B     1/7/2011   1/20/2011   Account No.="35287930"; Dosage="medium"
    10  Drug       A    1/3/2011    1/6/2011    Dosage="low"
    10  Drug       B    1/9/2011    1/13/2011   Dosage="high"
    10  Stroke          1/8/2011        

Моя цель - написать текстовый файл, столбцы которого разделены символом табуляции ("\ t") и данными атрибута (последний столбец), который похож на список, разделенный символом ";".

подробности о желаемом выводе приведены здесь http://www.cs.umd.edu/hcil/eventflow/manual/chapter_start.html#1.4

как я могу это сделать в R? Thx

1 Ответ

0 голосов
/ 09 июня 2018

Один из вариантов - использовать функцию apply и передавать построчные данные для последних 3 столбцов.Хорошей частью apply является то, что данные строк передаются в функцию как named-vector, где name соответствует именам столбцов.

Теперь нужно сначала объединить name с value именованного вектора, используя paste, а затем снова объединить в одну строку, используя collapse=";" аргумент функции paste0.Решение будет выглядеть так:

cbind(df[1:4],Attribute = 
   apply(df[,5:7],1, function(x)paste0(paste(names(x[!is.na(x)]),x[!is.na(x)], sep = "="),
   collapse = ";")))
# ID Event.Category Start.Time  End.Time                             Attribute
# 1  1         Stroke   1/1/2011      <NA>
# 2  1       Admitted   1/6/2011      <NA> Account.No.=24287939;Doctor.s_ID=5487
# 3  1      Diagnosed  1/25/2011      <NA>
# 4  6      Diagnosed   1/1/2011      <NA>
# 5  6   Drug       A   1/2/2011 1/10/2011                           Dosage=high
# 6  6   Drug       B   1/7/2011 1/20/2011    Account.No.=35287930;Dosage=medium
# 7 10   Drug       A   1/3/2011  1/6/2011                            Dosage=low
# 8 10   Drug       B   1/9/2011 1/13/2011                           Dosage=high
# 9 10         Stroke   1/8/2011      <NA>

Данные:

df <- read.table(text =
'ID  "Event Category"  "Start Time"  "End Time"    "Account No."   Dosage  Doctor\'s_ID
1   Stroke          1/1/2011         NA          NA                NA       NA      
1   Admitted         1/6/2011        NA       24287939      NA            5487
1   Diagnosed        1/25/2011      NA          NA                NA       NA
6   Diagnosed        1/1/2011       NA          NA                NA       NA
6   "Drug       A"     1/2/2011   1/10/2011       NA           "high"         NA
6   "Drug       B"     1/7/2011   1/20/2011   35287930      "medium"         NA
10  "Drug       A"    1/3/2011    1/6/2011          NA         "low"         NA
10  "Drug       B"    1/9/2011    1/13/2011         NA         "high"         NA
10  Stroke          1/8/2011        NA          NA                NA       NA',
stringsAsFactors = FALSE, header = TRUE)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...