Добавить столбец с буквой в зависимости от иерархических условий в R - PullRequest
1 голос
/ 09 мая 2020

Здравствуйте, у меня есть фрейм данных, например:

Groups Names COL1 COL2 COL3
G1 SP1 1 0.400 0.500 
G1 SP1 1 0.004 0.005 
G1 SP1 0 0.004 0.005 
G1 SP2 0 0.400 0.005 
G1 SP2 0 0.004 0.500 
G1 SP3 0 0.005 0.006 
G1 SP5 1 0.400 0.006 
G1 SP6 1 0.008 0.002 
G2 Sp12 1 0.004 0.005 
G2 SP1 0 0.050 0.600 
G2 SP1 0 0.400 0.600 
G2 SP2 0 0.004 0.005 
G2 SP2 0 0.004 0.005 
G2 SP5 0 0.004 0.005 
G2 SP6 0 0.003 0.002 
G2 SP7 0 0.560 0.760 
G2 SP12 0 0.004 0.003 
G3 SP5 0 0.87 0.767 

, и я хотел бы добавить столбец, в котором я заполняю буквы (L,M или P) для каждого Groups и каждого Names (так что внутри групп имена идентификаторов должны иметь одну и ту же букву) и вот идея (и мы должны соблюдать эту спецификацию c порядок:

if 
COL1 >= 1 & COL2 >= 0.05 & COL3 >= 0.05  -> COL4 = L
else
COL1 == 0 & COL2 >= 0.05 & COL3 >= 0.05  -> COL4 = M
else
COL1 >= 1 & COL2 >= 0.05 & COL3 < 0.05  -> COL4 = M
else
COL1 >= 1 & COL2 < 0.05 & COL3 < 0.05  -> COL4 = M
else
COL1 == 0 & COL2 < 0.05 & COL3 < 0.05  -> COL4 = P
else
COL1 == 0 & COL2 >= 0.05 & COL3 < 0.05  -> COL4 = P
else
COL1 == 0 & COL2 < 0.05 & COL3 >= 0.05  -> COL4 = P
else
COL1 == 0 & COL2 < 0.05 & COL3 >= 0.05  -> COL4 = P
else 
COL4 = P

Вот пример того, что я должен получить:

Groups Name COL1 COL2 COL3 COL4
G1 SP1 1 0.400 0.500 L this one had COL1 >= 1 & COL2 >= 0.05 & COL3 >= 0.05  -> COL4 = L
G1 SP1 1 0.004 0.005 L
G1 SP1 0 0.004 0.005 L
G1 SP2 0 0.400 0.005 P this one had COL1 == 0 & COL2 >= 0.05 & COL3 < 0.05  -> COL4 = P
G1 SP2 0 0.004 0.500 P
G1 SP3 0 0.005 0.006 P this one had COL1 == 0 & COL2 < 0.05 & COL3 < 0.05  -> COL4 = P
G1 SP5 1 0.400 0.006 M this one had COL1 >= 1 & COL2 >= 0.05 & COL3 < 0.05  -> COL4 = M
G1 SP6 1 0.008 0.002 M this one had COL1 >= 1 & COL2 < 0.05 & COL3 < 0.05  -> COL4 = M
G2 Sp12 1 0.004 0.005 M this one had COL1 >= 1 & COL2 < 0.05 & COL3 < 0.05  -> COL4 = M
G2 SP1 0 0.050 0.600 M
G2 SP1 0 0.400 0.600 M this one had COL1 == 0 & COL2 >= 0.05 & COL3 >= 0.05  -> COL4 = M
G2 SP2 0 0.004 0.005 P this one had COL1 == 0 & COL2 < 0.05 & COL3 < 0.05  -> COL4 = P
G2 SP2 0 0.004 0.005 P
G2 SP5 0 0.004 0.005 P this one had COL1 == 0 & COL2 < 0.05 & COL3 < 0.05  -> COL4 = P
G2 SP6 0 0.003 0.002 P this one had COL1 == 0 & COL2 < 0.05 & COL3 < 0.05  -> COL4 = P
G2 SP7 0 0.560 0.760 M this one had COL1 == 0 & COL2 >= 0.05 & COL3 >= 0.05  -> COL4 = M
G2 SP12 0 0.004 0.003 M
G3 SP5 0 0.87 0.767 M this one had COL1 == 0 & COL2 >= 0.05 & COL3 >= 0.05  -> COL4 = M

вот данные

> dput(test)
structure(list(Groups = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 3L), .Label = c("G1", 
"G2", "G3"), class = "factor"), Names = structure(c(1L, 1L, 1L, 
4L, 4L, 5L, 6L, 7L, 2L, 1L, 1L, 4L, 4L, 6L, 7L, 8L, 3L, 6L), .Label = c("SP1", 
"Sp12", "SP12", "SP2", "SP3", "SP5", "SP6", "SP7"), class = "factor"), 
    COL1 = c(1L, 1L, 0L, 0L, 0L, 0L, 1L, 1L, 1L, 0L, 0L, 0L, 
    0L, 0L, 0L, 0L, 0L, 0L), COL2 = c(0.4, 0.004, 0.004, 0.4, 
    0.004, 0.005, 0.4, 0.008, 0.004, 0.05, 0.4, 0.004, 0.004, 
    0.004, 0.003, 0.56, 0.004, 0.87), COL3 = c(0.5, 0.005, 0.005, 
    0.005, 0.5, 0.006, 0.006, 0.002, 0.005, 0.6, 0.6, 0.005, 
    0.005, 0.005, 0.002, 0.76, 0.003, 0.767)), class = "data.frame", row.names = c(NA, 
-18L))

1 Ответ

1 голос
/ 09 мая 2020

Мы можем использовать выражение с case_when

library(dplyr)
test %>% 
  mutate(COL4 = case_when(COL1 >= 1 & COL2 >= 0.05 & COL3 >= 0.05 ~ 'L', 
         COL1 == 0 & COL2 >= 0.05 & COL3 >= 0.05 ~ 'M',
         COL1 >= 1 & COL2 >= 0.05 & COL3 < 0.05 ~ 'M', 
         COL1 >= 1 & COL2 < 0.05 & COL3 < 0.05 ~ "M",
         COL1 == 0 & COL2 < 0.05 & COL3 < 0.05 ~ 'P',
         COL1 == 0 & COL2 >= 0.05 & COL3 < 0.05 ~ 'P',
         COL1 == 0 & COL2 < 0.05 & COL3 >= 0.05 ~ 'P',
         COL1 == 0 & COL2 < 0.05 & COL3 >= 0.05 ~ 'P',
              TRUE ~ 'P')) %>% 
  group_by(Groups, Names) %>%
  mutate(COL4 = first(COL4))
# A tibble: 18 x 6
# Groups:   Groups, Names [12]
#   Groups Names  COL1  COL2  COL3 COL4 
#   <fct>  <chr> <int> <dbl> <dbl> <chr>
# 1 G1     SP1       1 0.4   0.5   L    
# 2 G1     SP1       1 0.004 0.005 L    
# 3 G1     SP1       0 0.004 0.005 L    
# 4 G1     SP2       0 0.4   0.005 P    
# 5 G1     SP2       0 0.004 0.5   P    
# 6 G1     SP3       0 0.005 0.006 P    
# 7 G1     SP5       1 0.4   0.006 M    
# 8 G1     SP6       1 0.008 0.002 M    
# 9 G2     SP12      1 0.004 0.005 M    
#10 G2     SP1       0 0.05  0.6   M    
#11 G2     SP1       0 0.4   0.6   M    
#12 G2     SP2       0 0.004 0.005 P    
#13 G2     SP2       0 0.004 0.005 P    
#14 G2     SP5       0 0.004 0.005 P    
#15 G2     SP6       0 0.003 0.002 P    
#16 G2     SP7       0 0.56  0.76  M    
#17 G2     SP12      0 0.004 0.003 M    

ПРИМЕЧАНИЕ. Изменено «Sp12» на «SP12» в столбце «Имена»

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