Здравствуйте, вот фрейм данных
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"))
и из этого фрейма данных я хочу получить еще один фрейм данных, например:
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 в ячейках, и верхний или нижний регистры будут зависеть от того, найдем ли мы идентификатор c COL4 значение как минимум для одного вида в других группах.
- 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
h ave a COL1=0
AND COL2
AND
COL3 > 0.05
И нет имен, которые имеют такое же COL4
содержимое, что и такое же имя в разных группах - X помещается, когда
all
строка для Name
имеют COL1=0
И COL2``OR
COL3 > 0.05
AND
есть по крайней мере одно Имена, которые имеют такое же содержание COL4
, что и такое же Имя в разных Группах - x поместите, когда
all
строка для Name
имеет COL1=0
И COL2
OR
COL3 > 0.05
AND
нет Имен, которые имеют такое же содержание COL4
, что и такое же Имя, в разных Группах - NA ставится, когда в
Group
нет Name
, давайте возьмем 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
имеет a COL1 > 0
, тогда в новом фрейме данных будет буква A
или a
. И это будет a
, потому что ни один другой SP1
в другом Groups
не имеет такой же Последовательности (Sequence20)
`
благодаря Дэну Чалтиэлю здесь: Использование dplyr для создать новый фрейм данных в зависимости от пороговых значений Я получил этот код, который не включает переменные нижнего / верхнего регистра:
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)
с этим кодом, который я смог получить, тогда:
G1 G2
SP1 A B
SP2 X X
SP3 X NA
SP4 NA NA
SP5 A X
SP6 A X
SP7 NA B