Проверьте значения в столбцах таблицы данных и верните новую таблицу на основе условия в R - PullRequest
1 голос
/ 16 октября 2019

У меня есть такая таблица:

  V1    V2   V3 V4 V5 V6 V7 V8 V9 
  1     1  7512  1  0  0  0  0  0  
  1  7506 10949  0  0  0  0  0  1
  1 10943 13175  0  0  0  0  0  0      
  1 13169 20070  0  1  1  0  0  0

Каждая строка в таблице является фрагментом, поэтому фрагмент равен 4. Con1 включает V4, V5, V6 и con2 V7, V8, V9. Я хочусоздайте новую таблицу в R, в которой я проверю, равны ли элементы в con1 и con 2 нулю или единице. Если в элементах каждого условия есть хотя бы 1, оно покрывается, если нет, то таблица будет выглядеть следующим образом:

label fragnum covered uncovered 
con1  4       2       2 
con2  4       1       3

Ответы [ 2 ]

2 голосов
/ 16 октября 2019

Один dplyr и tidyr Возможны следующие варианты:

df %>%
 transmute(con1 = if_else(rowSums(select(., V4:V6)) > 0, "covered", "uncovered"),
           con2 = if_else(rowSums(select(., V7:V9)) > 0, "covered", "uncovered"),
           fragnum = n()) %>%
 pivot_longer(names_to = "variables", values_to = "values", -fragnum) %>%
 count(fragnum, variables, values) %>%
 pivot_wider(names_from = "values", values_from = "n")

  fragnum variables covered uncovered
    <int> <chr>       <int>     <int>
1       4 con1            2         2
2       4 con2            1         3
1 голос
/ 16 октября 2019

В base вы можете использовать rowSums для определенных столбцов, чтобы увидеть, есть ли 1 в строке, например:

tt  <- sapply(list(c("V4", "V5", "V6"), c("V7", "V8", "V9"))
              , function(i) sum(rowSums(x[,i]) > 0))

data.frame(label=c("con1", "con2"), fragnum=nrow(x), covered=tt
         , uncovered=nrow(x) - tt)
#  label fragnum covered uncovered
#1  con1       4       2         2
#2  con2       4       1         3

Данные:

x <- structure(list(V1 = c(1L, 1L, 1L, 1L), V2 = c(1L, 7506L, 10943L, 
13169L), V3 = c(7512L, 10949L, 13175L, 20070L), V4 = c(1L, 0L, 
0L, 0L), V5 = c(0L, 0L, 0L, 1L), V6 = c(0L, 0L, 0L, 1L), V7 = c(0L, 
0L, 0L, 0L), V8 = c(0L, 0L, 0L, 0L), V9 = c(0L, 1L, 0L, 0L))
, class = "data.frame", row.names = c(NA, -4L))
...