R скрипт для агрегирования строк по группам в виде объединения символов без R пакетов - PullRequest
0 голосов
/ 10 мая 2019

Я хочу добавить новый столбец (TAinfo-Day & TAinfo-Arm) в существующую таблицу (SM), содержащий для каждой строки конкатенацию в виде строки из N строк связанной таблицы (TA), соответствующих определенным условиям: T-DAY = SM & TA Клавиши: Study, Group

Ограничение, я использую Spotfire 7.11, который позволяет использовать скрипт R, но НЕ полезные пакеты, такие как библиотека (dplyr)

Мне удалось создать новую временную таблицу SMtemp, которая содержит данные о желаниях из TA, но распределена по нескольким строкам.

Следующим шагом должно стать их агрегирование.

TA TA

Study <K>   Group <K>   Arm T-Day
20190510    01          A1      1
20190510    01          A2      21
20190510    01          A3      35
20190510    02          B1      1
20190510    02          B2      22
20190510    02          B3      35

Целью является создание столбцов "TAinfo-Day" и "TAinfo-Arm"

SM SM

Study <K>   SampleID    Group <K>   S-Day   TAinfo-Day  TAinfo-Arm
20190510    20190510-01.001     01  21      1,21        A1,A2
20190510    20190510-01.001     01  36      1,21,35     A1,A2,A3
20190510    20190510-01.002     01  21      1,21        A1,A2
20190510    20190510-01.002     01  36      1,21,35     A1,A2,A3
20190510    20190510-01.003     01  21      1,21        A1,A2
20190510    20190510-01.003     01  36      1,21,35     A1,A2,A3
20190510    20190510-02.001     02  21      1           B1
20190510    20190510-02.001     02  36      1,22,35     B1,B2,B3
20190510    20190510-02.002     02  21      1           B1
20190510    20190510-02.002     02  36      1,22,35     B1,B2,B3
20190510    20190510-02.003     02  21      1           B1
20190510    20190510-02.003     02  36      1,22,35     B1,B2,B3

SMtemp

Study <K>   SampleID      Group <K> S-DAY   T-DAY
20190510    20190510-01.001     01  21      1
20190510    20190510-01.001     01  21      21
20190510    20190510-01.001     01  36      1
20190510    20190510-01.001     01  36      21
20190510    20190510-01.001     01  36      35
20190510    20190510-01.002     01  21      1
20190510    20190510-01.002     01  21      21
20190510    20190510-01.002     01  36      1
20190510    20190510-01.002     01  36      21
20190510    20190510-01.002     01  36      35
20190510    20190510-01.003     01  21      1
20190510    20190510-01.003     01  21      21
20190510    20190510-01.003     01  36      1
20190510    20190510-01.003     01  36      21
20190510    20190510-01.003     01  36      35
20190510    20190510-02.001     02  21      1
20190510    20190510-02.001     02  36      1
20190510    20190510-02.001     02  36      22
20190510    20190510-02.001     02  36      35
20190510    20190510-02.002     02  21      1
20190510    20190510-02.002     02  36      1
20190510    20190510-02.002     02  36      22
20190510    20190510-02.002     02  36      35
20190510    20190510-02.003     02  21      1
20190510    20190510-02.003     02  36      1
20190510    20190510-02.003     02  36      22
20190510    20190510-02.003     02  36      35

Заранее большое спасибо за вашу помощь.

Ответы [ 2 ]

0 голосов
/ 15 мая 2019

Я заменил тире в именах переменных на подчеркивания ...

Шаг 1. Слияние данных

#merge data
SM_temp<-merge(SM,TA,by=c("Study","Group"))
SM_temp<-subset(SM_temp,T_Day<=S_Day)

Шаг 2. Агрегирование

SM_new<-aggregate(cbind(Arm,T_Day)~Study+Group+SampleID+S_Day,data=SM_temp,FUN = paste0,collapse=",")
0 голосов
/ 13 мая 2019

Spotfire разрешает dplyr, но могут быть карманы функциональности dplyr, которые не поддерживаются TERR, особенно в старых версиях (но вы всегда можете обновить TERR до последней версии).

Во всяком случае, чтобы избежать использования какого-либо дополнительного пакета, его можно решить немного более многословно:

#just in case
if('TAinfo' %in% colnames(SM)) SM$TAinfo=NULL

####summarise with concatenated string of all Tdays by Study and Group
#option1: use flexible column names (ideally col1,2,3 are input parms)
col1='Study'
col2='Group'
col3='Tday'
myformula=formula(paste(col3,'~',col1,'+',col2))
TA2=aggregate(myformula,TA,FUN=paste,collapse=',')
#option2: use literal column names
#TA2=aggregate(Tday ~ Study+Group,TA,FUN=paste,collapse=',')

#merge to main table creating Tday temporary column
SM=merge(SM,TA2,by=c('Study','Group'))

#function to cut string back to max day
cutagg = function(x,y) {
  yv=strsplit(y,',')[[1]]
  yv=yv[yv<=x]
  return (paste(yv,collapse=', '))
}

#create TAinfo column: cutting Tday up to Sday
TAinfo=mapply(cutagg,SM$Sday,SM$Tday)
#remove temporary column
SM$Tday=NULL
#export TAinfo column separately

Gaia

...