Как подсчитать уникальные значения в строке в R - PullRequest
0 голосов
/ 19 июня 2020

У меня есть следующий набор данных панели в R, который содержит переменную ID и показывает данные последнего входа в систему для этого ID.

id name address last_log_june1 last_log_june2 last_log_june3 last_log_june4 last_log_june"n"
1    A           2020-06-01     2020-06-01    2020-06-03
2    B           2020-06-01      2020-06-01   2020-06-01
3    C           2020-06-01     2020-06-02    2020-06-03

В приведенном выше наборе данных я хочу вычислить уникальное количество раз, когда A, B и C входили в систему. Как мне сделать это в R, чтобы я выбирал только "last_log_date "переменные и заставить R подсчитывать уникальные даты в них? Я также хочу добавить этот столбец счетчика в набор данных.

С нетерпением жду решения этой проблемы!

Спасибо, Рашита

Ответы [ 2 ]

0 голосов
/ 19 июня 2020

В пакете dplyr (версия 1.0.0) есть некоторые функции, которые могут помочь.

Предположим, ваши данные называются df со столбцами ID, name, address, а ряд столбцов начинается с last_log_june, и возможно, что в этих столбцах существуют некоторые значения NA.

new_df <- df %>% rowwise() %>% ## indicate you want to apply functions on rows
  mutate(na_exists = ifelse(sum(is.na(c_across(starts_with("last_log_june"))))>0,1,0), 
         ## an intermediate variable na_exists to indicate whether or not there is `NA` in any of the columns
         unique_with_NA = length(unique(c_across(starts_with("last_log_june")),na.rm=T))
         ## if there is NA, the unique function will also count `NA` as a unique value
         unique_withno_NA = unique_with_NA-na_exists
         ## if you don't want NA counted as an unique value, then the final result should exclude it
) %>% select (-na_exists, -unique_with_NA)
      ## remove the intermediate variables

использование функции c_across(starts_with("last_log_june")) учитывает только столбцы, начинающиеся с last_log_june

0 голосов
/ 19 июня 2020

Вам нужна функция unique и примените ее к строкам.

df <- data.frame(id = 1:3, name = LETTERS[1:3], 
                 last_log_june1 = c("2020-06-01", "2020-06-01", "2020-06-01"), 
                 last_log_june2 = c("2020-06-01", "2020-06-01", "2020-06-02"),  
                 last_log_june3 = c("2020-06-01", "2020-06-02", "2020-06-03"), 
                 stringsAsFactors = FALSE)

n = 3 # number of "last_log_june" columns
result <- apply(df[, paste0("last_log_june", 1:n)], 1, function(x) unique(unlist(x)))
sapply(result, length) # shows a vector with the number of unique values
df$count <- sapply(result, length) # new column

Это то, что вам нужно?

...