Есть ли простой способ сопоставить строки фрейма данных? - PullRequest
1 голос
/ 01 апреля 2020

Я хотел бы определить синхронные действия для идентификатора в течение времени t. В основном, я хотел бы знать, какие виды деятельности распространены в течение времени, в зависимости от пола. Необычные действия я заменил на 0.

Ввод

id     DMSex       t1  t2  t3  t4  t5  t6 
12       M         12  12  12  12  12  17
12       F         10  13  12  12  12  17 

Ввод:

id  t1  t2  t3  t4  t5  t6 
12   0   0  12  12  12  17

Ответы [ 2 ]

2 голосов
/ 01 апреля 2020

Попробуйте:

library(dplyr)

df %>%
  group_by(id) %>%
  mutate_at(-1, as.numeric) %>%
  summarise_at(-1, ~ case_when(n_distinct(.) != 1 ~ 0, TRUE ~ first(.)))

Вывод:

# A tibble: 1 x 7
     id    t1    t2    t3    t4    t5    t6
  <int> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1    12     0     0    12    12    12    17

Вы также можете заменить n_distinct(.) != 1 на !all(. == .[1]), !any(duplicated(.)) или sd(.) != 0, среди прочих.

1 голос
/ 01 апреля 2020

Вот подход data.table.

library(data.table)
setDT(data)[,lapply(.SD,function(x){
     if(length(unique(x)) > 1) {0}
     else{unique(x)}}),
  by = id,.SDcols = c(setdiff(names(data),"DMSex"))]
#   id t1 t2 t3 t4 t5 t6
#1: 12  0  0 12 12 12 17
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...