Использование dplyr для создания нового кадра данных в зависимости от порогов - PullRequest
1 голос
/ 04 мая 2020
   Groups Names COL1  COL2  COL3        COL4
1      G1   SP1    1 0.400 0.500   Sequence1
2      G1   SP1    1 0.004 0.005   Sequence2
3      G1   SP1    0 0.004 0.005   Sequence3
4      G1   SP2    0 0.400 0.005 Sequence123
5      G1   SP2    0 0.004 0.500  Sequence14
6      G1   SP3    0 0.005 0.006  Sequence15
7      G1   SP5    1 0.400 0.006  Sequence16
8      G1   SP6    1 0.008 0.002  Sequence20
10     G2   Sp1    0 0.004 0.005  Sequence17
11     G2   SP1    0 0.050 0.600  Sequence18
12     G2   SP1    0 0.400 0.600   Sequence3
13     G2   SP2    0 0.004 0.005  Sequence22
14     G2   SP2    0 0.004 0.005  Sequence23
15     G2   SP5    0 0.004 0.005  Sequence16
16     G2   SP6    0 0.003 0.002  Sequence21
17     G2   SP7    0 0.560 0.760  Sequence67

Вот dput:

dput(test_df)
structure(list(Groups = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L), .Label = c("G1", "G2"), class = "factor"), 
    Names = structure(c(2L, 2L, 2L, 3L, 3L, 4L, 5L, 6L, 1L, 2L, 
    2L, 3L, 3L, 5L, 6L, 7L), .Label = c("Sp1", "SP1", "SP2", 
    "SP3", "SP5", "SP6", "SP7"), class = "factor"), COL1 = c(1L, 
    1L, 0L, 0L, 0L, 0L, 1L, 1L, 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), 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), COL4 = structure(c(1L, 
    8L, 13L, 2L, 3L, 4L, 5L, 9L, 6L, 7L, 13L, 11L, 12L, 5L, 10L, 
    14L), .Label = c("Sequence1", "Sequence123", "Sequence14", 
    "Sequence15", "Sequence16", "Sequence17", "Sequence18", "Sequence2", 
    "Sequence20", "Sequence21", "Sequence22", "Sequence23", "Sequence3", 
    "Sequence67"), class = "factor")), class = "data.frame", row.names = c("1", 
"2", "3", "4", "5", "6", "7", "8", "10", "11", "12", "13", "14", 
"15", "16", "17"))
and from this dataf

rame. Мне нужно получить другой фрейм данных, такой как:

    G1  G2
SP1 A   B
SP2 x   x
SP3 x   NA
SP4 NA  NA
SP5 A   X
SP6 a x
SP7 NA b

Идея состоит в том, чтобы каждая группа добавляла Имена, которые присутствуют в строке и добавляют буквы A, B, X или NA в ячейках и верхнем или нижнем регистре, будут зависеть, если мы найдем значение identi c COL4 для хотя бы одного вида в группах anotger.

  • A ставится, когда any строка для Name имеет COL1 >0 И существует хотя бы одно Имя, которое имеет такое же содержимое COL4, что и одно и то же Имя в разных группах
  • a ставится, когда строка any для Name имеет COL1 >0 И нет имен, которые имеют такое же содержимое COL4, что и то же имя в других группах
  • B когда any строка для Name имеет COL1=0 И COL2 AND COL3 > 0.05 И есть хотя бы одно Имя, имеющее такое же содержание COL4, что и одно и то же Имя в разных группах
  • b ставится, когда any строка для Name имеет COL1=0 И COL2 AND COL3 > 0.05 И нет Na mes, которые имеют одинаковое COL4 содержимое с тем же именем в разных группах
  • X ставится, когда all строка для Name имеет COL1=0 AND COL2``OR COL3 > 0.05 AND существует по крайней мере одно имя, которое имеет одинаковое COL4 содержимое с тем же именем в разных группах
  • x ставится, когда строка all для Name имеет COL1=0 AND COL2 OR COL3 > 0.05 AND нет Имен, имеющих одинаковое содержание COL4 с тем же Именем в разных группах
  • NA ставится, когда в * нет Name 1062 *

давайте рассмотрим 4 примера:

1) Для G1-SP1 мы видим, что у row1 есть COL1 > 0, тогда у него будет буква A или a в новом фрейме данных. Теперь, чтобы узнать, будет ли это A или a, мы должны взглянуть на COL4, мы видим в row12, что Sequence3 также присутствует в G2 для SP1, так что это будет 'A'

2) Мы видим для G2-SP1, что row12 имеет COL2 и COL3 равны > 0.05, тогда он будет иметь буква B или b в новом кадре данных. И это будет B, потому что в G1, row3 Sequence3 также присутствует в G2 для SP1.

3) Мы видим для G2-SP2, что ни одна строка не имеет COL1 >0X или COL2 и COL3 равны > 0.05, тогда она будет иметь букву B или x в новый фрейм данных. И это будет x, потому что никакие другие SP2 в других Groups не имеют одинаковую последовательность `(Sequence22, Sequence23 или Sequence24)

4) Мы видим для G1-SP6, что row8 имеет COL1 > 0, тогда в новом фрейме данных будет буква A или a. И это будет a, потому что никакие другие SP1 в других Groups не имеют такой же последовательности (Sequence20)

`

Для этого я попытался:

Env_table<-as.data.frame(test_df) %>%
  group_by(Groups,Names) %>%
  mutate(Env_variable = replace_na(COL1, "."),
         Env_variable = ifelse(any(COL1 >=1) , "A", Env_variable)) %>%
  mutate(Env_variable = ifelse(all(COL1 ==0 ) && all(COL2 >0.05) && all(COL3 >0.05) , "B", Env_variable)) %>%
  mutate(Env_variable = ifelse(all(COL1 ==0 ) && all(COL2 <0.05) && all(COL3 <0.05) , "X", Env_variable)) %>%
  mutate(Env_variable = ifelse(all(COL1 ==0 ) && all(COL2 <0.05) && all(COL3 >0.05) , "X", Env_variable)) %>%
  mutate(Env_variable = ifelse(all(COL1 ==0 ) && all(COL2 >0.05) && all(COL3 <0.05) , "X", Env_variable)) %>%
  mutate(Env_variable = ifelse(all(COL1 ==0) && all(!is.na(COL1)) && all(COL2 >0.05) && all(COL3 >0.05) , "*", Env_variable))%>%
  slice(1) %>%
  pivot_wider(id_col = Names, names_from = Groups, values_from = Env_variable) %>%
  arrange(as.integer(str_extract(Names, "\\d+")))

, где Env_variable - пустой столбец, в котором будут храниться значения A, B, X или NA.

Спасибо за вашу помощь

1 Ответ

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

Ваш вопрос не кристально ясен, но вот попытка ответить:

test_df %>% 
  group_by(Groups, Names) %>% 
  summarise(
    x=case_when(
      any(COL1>=1, na.rm=TRUE) ~ "A",
      any(COL1==0 & (COL2>0.05 & COL3>0.05), na.rm=TRUE) ~ "B",
      any(COL1==0 & (COL2<0.05 | COL3<0.05), na.rm=TRUE) ~ "X",
      TRUE ~ NA_character_
    )
  ) %>% 
  pivot_wider(names_from = Groups, values_from = x)

Это даст такой вывод:

  Names G1    G2   
  <fct> <chr> <chr>
1 SP1   A     B    
2 SP2   X     X    
3 SP3   X     NA   
4 SP5   A     X    
5 SP6   A     X    
6 SP1   NA    X    
7 SP7   NA    B
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...