Группировка строк данных в зависимости от условия - PullRequest
0 голосов
/ 26 марта 2020

Для некоторых это легкое упражнение, для меня это немного сложно. Я хотел бы рассчитать количество времени, которое люди с одинаковым идентификатором проводят во времени t. В основном я хотел бы знать общее количество времени, которое люди проводят вместе и в одиночку, в зависимости от пола.

Входные данные

id     DMSex       t1  t2  t3  t4  t5  t6 
12       M         15  0   0   15  15  15
12       F         0   15  15  0   0   15  
13       F         15  0   15  0   0   0
13       M         15  15   0  15  0   15

Выходные данные:

 id  Together  Male only  Female only
 12    15           45       15
 13    15           45       30

Ответы [ 2 ]

3 голосов
/ 26 марта 2020

Вы также можете решить это следующим образом:

df <- read.table(text = "id     DMSex       t1  t2  t3  t4  t5  t6 
12       M         15  0   0   15  15  15
12       F         0   15  15  0   0   15  
13       F         15  0   15  0   0   0
13       M         15  15   0  15  0   15", header = TRUE)

library(data.table)

setDT(df)[order(DMSex), {
  pos <- sapply(.SD, function(x) all(x > 0))
  comm <- sum(.SD[1, pos, with = FALSE])
  onlyFM <- rowSums(.SD[, !pos, with = FALSE])
  .(together = comm, males_only = onlyFM[2], females_only = onlyFM[1])
}, by = id, .SDcols = t1:t6]

#       id together males_only females_only
# 1:    12       15         45           30
# 2:    13       15         45           15
1 голос
/ 26 марта 2020

Создайте мужские и женские матрицы и затем используйте указанные вычисления.

ix <- -(1:2)
males <- as.matrix(subset(DF, DMSex == "M")[ix])
females <- as.matrix(subset(DF, DMSex == "F")[ix])

data.frame(id = unique(DF$id),
  together = rowSums(pmin(females, males)),
  males_only = rowSums(pmax(males - females, 0)),
  females_only = rowSums(pmax(females - males, 0)))

подача:

  id together males_only females_only
2 12       15         45           30
3 13       15         45           15

Примечание

Lines <- "id     DMSex       t1  t2  t3  t4  t5  t6 
12       M         15  0   0   15  15  15
12       F         0   15  15  0   0   15  
13       F         15  0   15  0   0   0
13       M         15  15   0  15  0   15"
DF <- read.table(text = Lines, header = TRUE)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...