Возврат заголовка столбца в виде значения на основе условий - PullRequest
1 голос
/ 05 апреля 2019

У меня есть фрейм данных с 32 переменными (столбцами), с UserId и 31 днем ​​месяца и 350 строками. Каждое значение в днях месяца представляет собой число от 0 и выше в целочисленном формате. Я хочу создать новый фрейм данных, в котором каждое значение больше 0 теперь отображает имя соответствующего столбца.

Ниже приведен пример. Я хочу перейти из таблицы 1 в таблицу 2, но я не сталкивался с тем, как это можно сделать. Любая помощь будет великолепна.

Table 1

UserID    01.01.2019    02.01.2019    03.01.2019    04.01.2019    05.01.2019
20        1             0             1             1             1
28        1             0             0             0             1
37        0             0             0             0             1
40        1             0             0             0             0
43        1             1             1             1             0

Table 2

UserID     Date
20         01.01.2019
20         03.01.2019
20         04.01.2019
20         05.01.2019
28         01.01.2019
28         05.01.2019
37         05.01.2019
40         01.01.2019
43         01.01.2019
43         02.01.2019
43         03.01.2019
43         04.01.2019

Ответы [ 5 ]

1 голос
/ 05 апреля 2019

Для завершения здесь есть базовая опция R. Используя which, мы сначала находим индексы строк и столбцов, а затем получаем соответствующие UserID из индекса строк и имен столбцов из индексов столбцов.

inds <- which(df == 1, arr.ind = TRUE)
data.frame(userID = df$UserID[inds[, 1]], variable = names(df)[inds[, 2]])

#   userID   variable
#1      20 01.01.2019
#2      28 01.01.2019
#3      40 01.01.2019
#4      43 01.01.2019
#5      43 02.01.2019
#6      20 03.01.2019
#7      43 03.01.2019
#8      20 04.01.2019
#9      43 04.01.2019
#10     20 05.01.2019
#11     28 05.01.2019
#12     37 05.01.2019
1 голос
/ 05 апреля 2019

Вы можете просто использовать-

> library(data.table)
> setDT(melt(dt,id.vars="UserID"))[value==1,]

    UserID    variable value
 1:     20 X01.01.2019     1
 2:     28 X01.01.2019     1
 3:     40 X01.01.2019     1
 4:     43 X01.01.2019     1
 5:     43 X02.01.2019     1
 6:     20 X03.01.2019     1
 7:     43 X03.01.2019     1
 8:     20 X04.01.2019     1
 9:     43 X04.01.2019     1
10:     20 X05.01.2019     1
11:     28 X05.01.2019     1
12:     37 X05.01.2019     1
1 голос
/ 05 апреля 2019

С dplyr:

Tab1 <- structure(list(UserID = c(20L, 28L, 37L, 40L, 43L), X01.01.2019 = c(1L, 
1L, 0L, 1L, 1L), X02.01.2019 = c(0L, 0L, 0L, 0L, 1L), X03.01.2019 = c(1L, 
0L, 0L, 0L, 1L), X04.01.2019 = c(1L, 0L, 0L, 0L, 1L), X05.01.2019 = c(1L, 
1L, 1L, 0L, 0L)), class = "data.frame", row.names = c(NA, -5L
))

library(tidyverse)
Tab2 <- Tab1 %>% 
gather(Date,var,-UserID) %>% 
filter(var==1) %>% 
select(-var) %>% 
mutate(Date=sub("X","",.$Date)) %>% 
arrange(UserID)

Tab2

   UserID       Date
1      20 01.01.2019
2      20 03.01.2019
3      20 04.01.2019
4      20 05.01.2019
5      28 01.01.2019
6      28 05.01.2019
7      37 05.01.2019
8      40 01.01.2019
9      43 01.01.2019
10     43 02.01.2019
11     43 03.01.2019
12     43 04.01.2019

0 голосов
/ 05 апреля 2019

Вот еще одна базовая опция R, которая использует функцию stack, то есть

subset(cbind(df[1], stack(df[-1])), values == 1)

, которая дает,

   UserID values         ind
1      20      1 X01.01.2019
2      28      1 X01.01.2019
4      40      1 X01.01.2019
5      43      1 X01.01.2019
10     43      1 X02.01.2019
11     20      1 X03.01.2019
15     43      1 X03.01.2019
16     20      1 X04.01.2019
20     43      1 X04.01.2019
21     20      1 X05.01.2019
22     28      1 X05.01.2019
23     37      1 X05.01.2019
0 голосов
/ 05 апреля 2019

Если вы хотите использовать пакет tidyr, есть функция сборщик, которая сделает это. Документация здесь .

Ваш код будет выглядеть примерно так:

table2 <- table1 %>% 
        gather("Date", "Value", -UserID) %>%
        filter(Value >0) %>%
        select(-Value)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...