Матрица подмножеств в R

#r

#r

Вопрос:

Итак, в основном, какие дни в течение обеих недель были либо меньше 0, либо больше 0

              [,1]  [,2]
M            -5    -5
T             8    -9
W            -4     9
Th            6     8
F             7    -3
  
 
# however my output is this
   [,1] [,2]  #I want the row label M, how do I do that?
   -1    -5 
  

Ответ №1:

Мы можем использовать drop = FALSE , чтобы избежать удаления измерений, поскольку по умолчанию используется

x[i, j, … , drop = TRUE]

когда в качестве выходных данных используется одна строка, drop = TRUE будет отбрасывать измерения, чтобы вернуть vector

 diff[diff[, "Week1"] <0 amp; diff[, "Week2" ]< 0, , drop = FALSE]
#.       Week1 Week2
#Monday    -1    -5
  

Или другой вариант Reduce

 diff[Reduce(`amp;`, asplit(diff > 0, 2)), , drop = FALSE]
#         Week1 Week2
#Thursday     4     5
  

ПРИМЕЧАНИЕ: diff это имя функции. Лучше называть идентификаторы объектов разными именами


Мы могли бы также использовать tidyverse

 library(dplyr)
diff %>% 
    as.data.frame %>% 
    rownames_to_column('rn') %>%
    filter(across(starts_with('Week'), `>`, 0))
 #       rn Week1 Week2
 #1 Thursday     4     5
  

данные

 diff <- structure(c(-1L, 8L, -3L, 4L, 7L, -5L, -4L, 9L, 5L, -2L), .Dim = c(5L, 
2L), .Dimnames = list(c("Monday", "Tuesday", "Wednesday", "Thursday", 
"Friday"), c("Week1", "Week2")))
  

Комментарии:

1. Можете ли вы показать dput данных. Я думал, что это matrix

2. Это матрица!

Ответ №2:

Вы можете использовать rowSums для получения строк с обоими неделями меньше 0 или выше 0.

 under <- diff[rowSums(diff > 0) == 0, , drop = FALSE]
over <- diff[rowSums(diff < 0) == 0, , drop = FALSE]
under

#       Week1 Week2
#Monday    -1    -5

over
#         Week1 Week2
#Thursday     4     5