R Data.table.Нужно изменить столбец с помощью группировки и сложной условной фильтрации - PullRequest
0 голосов
/ 18 декабря 2018

Вот пример данных:

zz <- "
id  Sub_Segment1    Sub_Segment2    Sub_Segment3    Sub_Segment4    Sub_Segment5
1   x   x1  r   y1  z1
1   x   x1  r   y1  z1
1   x   x1  r   y1  z1
1   x   x1  r   y1  z1
1   x   x1  r   y1  z1
1   x   x1  r   y1  z1
1   x   x1  r   y1  z1
2   y   x2  r   y2  z1
2   y   x2  r   y2  z1
2   y   x2  r   y2  z1
2   y   x2  r   y2  z1
2   y   x2  r   y2  z1
"

Data <- read.table(text=zz, header = TRUE)
setDT(Data)

Если я применяю свою модификацию ко всей таблице, она возвращает NA:

Data[(length(unique(Sub_Segment1[Sub_Segment1!=""]))==1),name:="test" , by=id ]

возвращает:

 id Sub_Segment1 Sub_Segment2 Sub_Segment3 Sub_Segment4 Sub_Segment5 name
 1:  1            x           x1            r           y1           z1   NA
 2:  1            x           x1            r           y1           z1   NA
 3:  1            x           x1            r           y1           z1   NA
 4:  1            x           x1            r           y1           z1   NA
 5:  1            x           x1            r           y1           z1   NA
 6:  1            x           x1            r           y1           z1   NA
 7:  1            x           x1            r           y1           z1   NA
 8:  2            y           x2            r           y2           z1   NA
 9:  2            y           x2            r           y2           z1   NA
10:  2            y           x2            r           y2           z1   NA
11:  2            y           x2            r           y2           z1   NA
12:  2            y           x2            r           y2           z1   NA

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

new_data = Data[id ==1]
new_data[(length(unique(Sub_Segment1[Sub_Segment1!=""]))==1),name:="test" , by=id ]

вернет правильный

   id Sub_Segment1 Sub_Segment2 Sub_Segment3 Sub_Segment4 Sub_Segment5 name
1:  1            x           x1            r           y1           z1 test
2:  1            x           x1            r           y1           z1 test
3:  1            x           x1            r           y1           z1 test
4:  1            x           x1            r           y1           z1 test
5:  1            x           x1            r           y1           z1 test
6:  1            x           x1            r           y1           z1 test
7:  1            x           x1            r           y1           z1 test

и

Data[id ==1,(length(unique(Sub_Segment1[Sub_Segment1!=""]))==1) ] # returns TRUE

Как мне изменить кодприменить мою функцию к каждой группе набора данных в виде data.table?

1 Ответ

0 голосов
/ 18 декабря 2018

Вы можете переместить идентификацию строк, которые вы хотите отредактировать, в часть команды, где вы выбираете столбцы:

# load data table package
library(data.table)
# create the data table from string
Data <- read.table(text=zz, header = TRUE)
setDT(Data)
# group by and adjust where condition is matched
Data[, name := ifelse(length(unique(Sub_Segment1[Sub_Segment1!=""])) == 1, "test", NA) , by=id ]

Вместо ifelse вы также можете вносить изменения везде, а затемфильтруйте или используйте операцию соединения.

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