Используйте R для создания нового df из одного df и разных значений столбцов - PullRequest
0 голосов
/ 04 апреля 2020

Я ищу метод для создания нового из одного с несколькими данными

Может быть, это все еще просто для вас, но я не могу действительно получить желаемый результат, может быть, некоторые специалисты могли бы просветить меня?

Вот первый df:

Col1    Col2    Event   Colvalue1   Colvalue2
Group1  Sp1.1   1   0.20    A
Group1  Sp1.2   1   0.20    A
Group1  Sp2.1   1   0.20    B
Group1  Sp3.1   2   0.12    B
Group1  Sp4.2   2   0.12    B
Group1  Sp5.1   2   0.12    B
Group1  Sp1.3   3   1.40    C
Group1  Sp1.4   3   1.40    C
Group1  Sp6.1   3   1.40    C
Group2  Sp6.1   1   1.20    D
Group2  Sp7.1   1   1.20    D
Group2  Sp9.3   1   1.20    D
Group2  Sp8.1   1   1.20    D
Group2  Sp8.2   2   0.40    E
Group2  Sp9.1   2   0.40    E
Group2  Sp9.2   2   0.40    E
Group2  Sp10.1  3   NA      NA
Group2  SP11.2  3   NA      NA
Group2  SP12.1  3   NA      NA
Group3  Sp1.1   1   5.2     F
Group3  Sp2.1   1   5.2     F
Group3  Sp3.1   1   5.2     F
Group3  Sp4.1   2   0.3     G
Group3  Sp4.2   2   0.3     G
Group3  Sp1.2   2   0.3     G
Group3  Sp8.1   2   0.3     G

Идея состоит в том, чтобы получить new_df вывод:

Species Group1  Group2 Group3
Sp1 A   NA G
Sp2 B   NA NO
Sp3 B   NA NO
Sp4 B   NA G
Sp5 B   NA NA
Sp6 C   D NA
Sp7 NA  D NA
Sp8 NA  E G
Sp9 NA  E NA
Sp10 NA X NA
Sp11 NA X NA
Sp12 NA X NA 

Вот объяснение: Идея состоит в том, чтобы сначала go через каждую группу в df1. Давайте возьмем первое:

Col1    Col2    Event   Colvalue1   Colvalue2
Group1  Sp1.1   1   0.20    A
Group1  Sp1.2   1   0.20    A
Group1  Sp2.1   1   0.20    B
Group1  Sp3.1   2   0.12    B
Group1  Sp4.2   2   0.12    B
Group1  Sp5.1   2   0.12    B
Group1  Sp1.3   3   1.40    C
Group1  Sp1.4   3   1.40    C
Group1  Sp6.1   3   1.40    C

из этой группы. Я хочу создать new_df с именем Group1 и в имени строки все Spname, присутствующие во всех df1:

Species Group1
Sp1 
Sp2 
Sp3 
Sp4 
Sp5 
Sp6 
Sp7 
Sp8 
Sp9 
Sp10
Sp11
Sp12

** Как заполнить эту таблицу? ** Чтобы решить, что поставить на Sp1 в Group1, я смотрю, где этот вид присутствует в Group1:

Col1    Col2    Event   Colvalue1   Colvalue2
Group1  Sp1.1   1   0.20    A
Group1  Sp1.2   1   0.20    A
Group1  Sp1.3   3   1.40    C
Group1  Sp1.4   3   1.40    C

Я смотрю на столбец Colvalue1 и сохраняю только событие с наименьшим значением здесь Event=1 с Colvalue1=0.20 против Colvalue1=1.40 для Event3. Это все, что у меня осталось:

Col1    Col2    Event   Colvalue1   Colvalue2
Group1  Sp1.1   1   0.20    A
Group1  Sp1.2   1   0.20    A

Вот так я знаю, я собираюсь добавить письмо в столбец Colvalue2 здесь: C:

Species Group1
Sp1 A
Sp2 
Sp3 
Sp4 
Sp5 
Sp6 
Sp7 
Sp8 
Sp9 
Sp10
Sp11
Sp12

и и так далее ...

еще один пример для Sp2 в Group1:

Здесь он присутствует только один раз:

Group1 Sp2.1 1 0.20 B

, поэтому я заполняю в письме B:

Species Group1
Sp1 A
Sp2 B
Sp3 
Sp4 
Sp5 
Sp6 
Sp7 
Sp8 
Sp9 
Sp10
Sp11
Sp12

и то же самое для Sp3,4, 5 & Sp6:

Species Group1
Sp1 A
Sp2 B
Sp3 B
Sp4 B
Sp5 B
Sp6 C
Sp7 
Sp8 
Sp9 
Sp10
Sp11
Sp12

с другой стороны Sp7,8 и 9 нет в этой группе, поэтому я добавляю NA:

Species Group1
Sp1 A
Sp2 B
Sp3 B
Sp4 B
Sp5 B
Sp6 C
Sp7 NA
Sp8 NA
Sp9 NA
Sp10 NA
Sp11 NA
Sp12 NA

давайте go к Group2 ...:

Col1    Col2    Event   Colvalue1   Colvalue2
Group2  Sp6.1   1   1.20    D
Group2  Sp7.1   1   1.20    D
Group2  Sp9.3   1   1.20    D
Group2  Sp8.1   1   1.20    D
Group2  Sp8.2   2   0.40    E
Group2  Sp9.1   2   0.40    E
Group2  Sp9.2   2   0.40    E

Здесь Sp1,2,3,4 и 5 отсутствуют, поэтому я добавляю NA, а Sp6 и Sp7 присутствуют только в Event1, поэтому я добавляю соответствующее письмо (D):

Species Group1 Group2
Sp1 A NA
Sp2 B NA
Sp3 B NA
Sp4 B NA
Sp5 B NA
Sp6 C NA
Sp7 NA D
Sp8 NA
Sp9 NA
Sp10 NA
Sp11 NA
Sp12 NA

Однако, Sp8 и Sp9 присутствуют в Events 1 и 2: Событие, для которого Sp8 имеет smallest value в Colvalue1, равно Event 2 (поэтому оно будет иметь букву E). Событие, для которого Sp9 имеет smallest value в Colvvalue1, равно Event 2 (поэтому оно будет иметь букву E).

Species Group1 Group2
Sp1 A NA
Sp2 B NA
Sp3 B NA
Sp4 B NA
Sp5 B NA
Sp6 C NA
Sp7 NA D
Sp8 NA E
Sp9 NA E 
Sp10 NA
Sp11 NA
Sp12 NA

А затем для Sp10,11 & 12 в Event3 нет Colvalue1, поэтому я просто поставил X.

Species Group1 Group2
Sp1 A NA
Sp2 B NA
Sp3 B NA
Sp4 B NA
Sp5 B NA
Sp6 C NA
Sp7 NA D
Sp8 NA E
Sp9 NA E 
Sp10 NA X
Sp11 NA X
Sp12 NA X

Вот вещь, я надеюсь, она достаточно ясна, не стесняйтесь задавать вопросы, если какие-либо вопросы остаются неясными. Если кто-нибудь может мне помочь, это было бы очень мило с его стороны. В то же время, вы все заботитесь о себе в это сложное время ...

Добавление сложности в Group3:

Здесь, когда Colvalue1 равен > to 5, тогда я значение NO если нет другого Colvalue1 <=, чем 5.

Group3  Sp1.1     1   5.2     F
Group3  Sp2.1     1   5.2     F
Group3  Sp3.1     1   5.2     F
Group3  Sp4.1     2   0.3     G
Group3  Sp4.2     2   0.3     G
Group3  Sp1.2     2   0.3     G
Group3  Sp8.1     2   0.3     G

, поэтому здесь, в Событии 1, например, Sp1: Group3 Sp1.1 1 5.2 F Group3 Sp1.2 2 0.3 G

имеет Colvalue1 > 5 в Event1, но также имеет Colvalue1 = 0.3 в Event2, поэтому принимает значение G.

Но для Sp2 он присутствует только в Event1 с Colvalue1 > 5, поэтому я просто присваиваю значение NO.

Вот кадр данных:

dput (head (df))

structure(list(Col1 = structure(c(1L, 1L, 1L, 1L, 1L, 1L), .Label = c("Group1", 
"Group2", "Group3"), class = "factor"), Col2 = structure(c(1L, 
2L, 8L, 9L, 11L, 12L), .Label = c("Sp1.1", "Sp1.2", "Sp1.3", 
"Sp1.4", "Sp10.1", "SP11.2", "SP12.1", "Sp2.1", "Sp3.1", "Sp4.1", 
"Sp4.2", "Sp5.1", "Sp6.1", "Sp7.1", "Sp8.1", "Sp8.2", "Sp9.1", 
"Sp9.2", "Sp9.3"), class = "factor"), Event = c(1L, 1L, 1L, 2L, 
2L, 2L), Colvalue1 = c(0.2, 0.2, 0.2, 0.12, 0.12, 0.12), Colvalue2 = c("A", 
"A", "B", "B", "B", "B"), Mean_dNdS = c(NA_character_, NA_character_, 
NA_character_, NA_character_, NA_character_, NA_character_)), class = c("data.table", 
"data.frame"), row.names = c(NA, -6L), .internal.selfref = <pointer: 0x7f8afd8052e0>)

1 Ответ

1 голос
/ 04 апреля 2020

При таком подходе:

  • separate столбец Species на 2, поскольку с использованием "Sp" и числа для идентификации Species
  • group_by оба Col1 (группа) и Species, чтобы посмотреть минимальные значения Colvalue1 в каждой комбинации группы / вида
  • Оставьте только минимум Colvalue1 (и оставьте также NA, так как это необходимо в конечный результат)
  • Final pivot_wider будет распределять группы 1 и 2 в результатах
  • Сортировка по значению цифры 1025 * в строке Species

Редактировать : Чтобы обратиться к Group3 в примере, добавьте дополнительный mutate, где, если все Colvalue1> 5, заменить на «НЕТ». Код и выходные данные обновлены.

Редактировать : Чтобы убедиться, что X остается после проверки Colvalue1 для уровней, которые> 5, он также проверяет, что Colvalue1 не NA. (Если это NA, то в противном случае убедитесь, что Colvalue2 остается). Оператор mutate был отредактирован, а выходные данные обновлены ниже.

library(tidyverse)

df %>%
  separate(Col2, into = c("Species", "Species_row"), sep = "([.])") %>%
  group_by(Col1, Species) %>%
  filter(Colvalue1 == min(Colvalue1) | is.na(Colvalue1)) %>%
  mutate(Colvalue2 = replace_na(Colvalue2, "X"),
         Colvalue2 = ifelse(all(Colvalue1 > 5) && all(!is.na(Colvalue1)), "NO", Colvalue2)) %>%
  slice(1) %>%
  pivot_wider(id_col = Species, names_from = Col1, values_from = Colvalue2) %>%
  arrange(as.integer(str_extract(Species, "\\d+")))

Output

# A tibble: 12 x 4
# Groups:   Species [12]
   Species Group1 Group2 Group3
   <chr>   <chr>  <chr>  <chr> 
 1 Sp1     A      NA     G     
 2 Sp2     B      NA     NO    
 3 Sp3     B      NA     NO    
 4 Sp4     B      NA     G     
 5 Sp5     B      NA     NA    
 6 Sp6     C      D      NA    
 7 Sp7     NA     D      NA    
 8 Sp8     NA     E      G     
 9 Sp9     NA     E      NA    
10 Sp10    NA     X      NA    
11 SP11    NA     X      NA    
12 SP12    NA     X      NA
...