Добавьте столбец и количество элементов rep в зависимости от условий в R - PullRequest
0 голосов
/ 09 мая 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
18     G3   SP5    0 0.87  0.767  Sequence16

, и я хотел бы добавить новый столбец COL5 Где я добавляю 1, если для каждого имени в группах мы разделили последовательности внутри групп. Например, давайте посмотрим на G1.

В SP1 есть Sequence3, который присутствует в G1 и G2, поэтому я помещаю количество повторений для row 3 and 12. здесь (2) То же самое для SP5, где Sequence15 в G1 и Sequence15 в G2 и G3, (здесь количество повторений 3)

Так что для всех dataframe я должен получить:

   Groups Names COL1  COL2  COL3        COL4 COL5
1      G1   SP1    1 0.400 0.500   Sequence1 0
2      G1   SP1    1 0.004 0.005   Sequence2 0
3      G1   SP1    0 0.004 0.005   Sequence3 2
4      G1   SP2    0 0.400 0.005 Sequence123 0
5      G1   SP2    0 0.004 0.500  Sequence14 0
6      G1   SP3    0 0.005 0.006  Sequence15 0
7      G1   SP5    1 0.400 0.006  Sequence16 3
8      G1   SP6    1 0.008 0.002  Sequence20 0
10     G2   Sp1    0 0.004 0.005  Sequence17 0
11     G2   SP1    0 0.050 0.600  Sequence18 0
12     G2   SP1    0 0.400 0.600   Sequence3 2
13     G2   SP2    0 0.004 0.005  Sequence22 0
14     G2   SP2    0 0.004 0.005  Sequence23 0
15     G2   SP5    0 0.004 0.005  Sequence16 3
16     G2   SP6    0 0.003 0.002  Sequence21 0
17     G2   SP7    0 0.560 0.760  Sequence67 0
18     G3   SP5    0 0.87  0.767  Sequence16 3

Вот 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,3L), .Label = c("G1", "G2","G3"), class = "factor"), 
    Names = structure(c(2L, 2L, 2L, 3L, 3L, 4L, 5L, 6L, 1L, 2L, 
    2L, 3L, 3L, 5L, 6L, 7L,5L), .Label = c("Sp1", "SP1", "SP2", 
    "SP3", "SP5", "SP6", "SP7","SP5"), class = "factor"), COL1 = c(1L, 
    1L, 0L, 0L, 0L, 0L, 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.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.767 ), 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","Sequence16"), class = "factor")), class = "data.frame", row.names = c("1", 
"2", "3", "4", "5", "6", "7", "8", "10", "11", "12", "13", "14", 
"15", "16", "17","18"))

Ответы [ 2 ]

2 голосов
/ 09 мая 2020

Мы можем подсчитать количество уникальных Groups для каждого COL4 значения и присвоить значение 1/0, если они больше 1.

library(dplyr)
test_df %>% 
 group_by(COL4, Names) %>% 
 mutate(COL5 = {ind = n_distinct(Groups); if(ind > 1) ind else 0})


#   Groups Names  COL1  COL2  COL3 COL4         COL5
#   <chr>  <chr> <int> <dbl> <dbl> <chr>       <dbl>
# 1 G1     SP1       1 0.4   0.5   Sequence1       0
# 2 G1     SP1       1 0.004 0.005 Sequence2       0
# 3 G1     SP1       0 0.004 0.005 Sequence3       2
# 4 G1     SP2       0 0.4   0.005 Sequence123     0
# 5 G1     SP2       0 0.004 0.5   Sequence14      0
# 6 G1     SP3       0 0.005 0.006 Sequence15      0
# 7 G1     SP5       1 0.4   0.006 Sequence16      3
# 8 G1     SP6       1 0.008 0.002 Sequence20      0
# 9 G2     Sp1       0 0.004 0.005 Sequence17      0
#10 G2     SP1       0 0.05  0.6   Sequence18      0
#11 G2     SP1       0 0.4   0.6   Sequence3       2
#12 G2     SP2       0 0.004 0.005 Sequence22      0
#13 G2     SP2       0 0.004 0.005 Sequence23      0
#14 G2     SP5       0 0.004 0.005 Sequence16      3
#15 G2     SP6       0 0.003 0.002 Sequence21      0
#16 G2     SP7       0 0.56  0.76  Sequence67      0
#17 G3     SP5       0 0.87  0.767 Sequence16      3

Или в data.table:

library(data.table)
setDT(test_df)[, COL5 := {ind = uniqueN(Groups); if(ind > 1) ind else 0}, .(COL4, Names)]

и в базе R:

test_df$COL5 <- with(test_df, as.integer(ave(as.character(Groups), COL4, Names,
                         FUN = function(x) length(unique(x)))))
test_df$COL5[test_df$COL5 == 1] <- 0
0 голосов
/ 09 мая 2020

Мы также можем сделать

library(dplyr)
test_df %>% 
  group_by(COL4, Names) %>% 
  mutate(COL5 = n_distinct(Groups) * (n_distinct(Groups) > 1))

Или с data.table

library(data.table)
setDT(test_df)[, COL5 := uniqueN(Groups) * (uniqueN(Groups) > 1), .(COL4, Names)]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...