Колонка из 1 и 0, чтобы указать выбор людей по ряду альтернатив?

Я пытаюсь настроить свои данные для работы в пакете mlogit в R

У меня есть датафрейм, созданный с помощью следующего кода:

id <- 1:10
id <- rep(id, each=5)
site <- c("site1", "site2", "site3", "site4", "site5")
choice <- c("site3", "site5", "site1", "site4", "site2",
            "site4", "site3", "site5", "site2", "site1")
df <- cbind(id, site)

Я хочу создать двоичную переменную, которая указывает на выбор сайта для каждого значения идентификатора. Поскольку переменная id представляет собой повторяющуюся последовательность, новая переменная индикатора должна быть равна 0 для каждой строки, кроме той, в которой "site" эквивалентна соответствующему значению "choice". Для id == 1 это будет первый элемент вектора выбора. Для id == 2 это будет второй элемент вектора выбора и так далее.

Конечный кадр данных с включенной переменной должен выглядеть следующим образом:

      id   site   indicator
 [1,] "1"  "site1" "0"
 [2,] "1"  "site2" "0"
 [3,] "1"  "site3" "1"
 [4,] "1"  "site4" "0"
 [5,] "1"  "site5" "0"
 [6,] "2"  "site1" "0"
 [7,] "2"  "site2" "0"
 [8,] "2"  "site3" "0"
 [9,] "2"  "site4" "0"
[10,] "2"  "site5" "1"
[11,] "3"  "site1" "1"
[12,] "3"  "site2" "0"
[13,] "3"  "site3" "0"
[14,] "3"  "site4" "0"
[15,] "3"  "site5" "0"
[16,] "4"  "site1" "0"
[17,] "4"  "site2" "0"
[18,] "4"  "site3" "0"
[19,] "4"  "site4" "1"
[20,] "4"  "site5" "0"
[21,] "5"  "site1" "0"
[22,] "5"  "site2" "1"
[23,] "5"  "site3" "0"
[24,] "5"  "site4" "0"
[25,] "5"  "site5" "0"
[26,] "6"  "site1" "0"
[27,] "6"  "site2" "0"
[28,] "6"  "site3" "0"
[29,] "6"  "site4" "1"
[30,] "6"  "site5" "0"
[31,] "7"  "site1" "0"
[32,] "7"  "site2" "0"
[33,] "7"  "site3" "1"
[34,] "7"  "site4" "0"
[35,] "7"  "site5" "0"
[36,] "8"  "site1" "0"
[37,] "8"  "site2" "0"
[38,] "8"  "site3" "0"
[39,] "8"  "site4" "0"
[40,] "8"  "site5" "1"
[41,] "9"  "site1" "0"
[42,] "9"  "site2" "1"
[43,] "9"  "site3" "0"
[44,] "9"  "site4" "0"
[45,] "9"  "site5" "0"
[46,] "10" "site1" "1"
[47,] "10" "site2" "0"
[48,] "10" "site3" "0"
[49,] "10" "site4" "0"
[50,] "10" "site5" "0"

Я пытался сделать это много раз и не могу понять это, и я не могу найти соответствующий ответ онлайн.

Заранее спасибо:)

3 ответа

Решение

Как предложил Акрун, используйте data.frame определить df:

df <- data.frame(id, site)

Затем сделайте:

df$indicator <- (df$site == choice[df$id])*1

*1 преобразует результат T/F в 1 и 0

Результат:

   id  site indicator
1   1 site1         0
2   1 site2         0
3   1 site3         1
4   1 site4         0
5   1 site5         0
6   2 site1         0
7   2 site2         0
8   2 site3         0
9   2 site4         0
10  2 site5         1
11  3 site1         1
12  3 site2         0
13  3 site3         0
14  3 site4         0
15  3 site5         0
16  4 site1         0
17  4 site2         0
18  4 site3         0
19  4 site4         1
20  4 site5         0
21  5 site1         0
22  5 site2         1
23  5 site3         0
24  5 site4         0
25  5 site5         0
26  6 site1         0
27  6 site2         0
28  6 site3         0
29  6 site4         1
30  6 site5         0
31  7 site1         0
32  7 site2         0
33  7 site3         1
34  7 site4         0
35  7 site5         0
36  8 site1         0
37  8 site2         0
38  8 site3         0
39  8 site4         0
40  8 site5         1
41  9 site1         0
42  9 site2         1
43  9 site3         0
44  9 site4         0
45  9 site5         0
46 10 site1         1
47 10 site2         0
48 10 site3         0
49 10 site4         0
50 10 site5         0

Если вы хотите строки вместо цифр или факторов, используйте as.character в столбце, который вы хотите конвертировать

Мы можем split "сайт" по "id", и использовать Map чтобы получить логический индекс, сравнивая с соответствующими значениями в "выборе".

df$indicator <- +(unlist(Map(`==`, split(df$site, df$id), choice), use.names=FALSE))

Или получить частоту "ID" с tabulateскопируйте "выбор", сравните с "сайтом" и преобразуйте в двоичный файл

+(rep(choice,tabulate(df$id))==df$site)

данные

df <- data.frame(id, site)

Используя данную матрицу (df), показатель может быть рассчитан как:

indicator <- as.numeric(choice[as.numeric(df[,"id"])] == df[,"site"])
# Final matrix 
df <- cbind(df,indicator)

Желаемая матрица:

id   site    indicator
 [1,] "1"  "site1" "0"      
 [2,] "1"  "site2" "0"      
 [3,] "1"  "site3" "1"      
 [4,] "1"  "site4" "0"      
 [5,] "1"  "site5" "0"      
 [6,] "2"  "site1" "0"      
 [7,] "2"  "site2" "0"      
 [8,] "2"  "site3" "0"      
 [9,] "2"  "site4" "0"      
[10,] "2"  "site5" "1"      
[11,] "3"  "site1" "1"      
[12,] "3"  "site2" "0"      
[13,] "3"  "site3" "0"      
[14,] "3"  "site4" "0"      
[15,] "3"  "site5" "0"      
[16,] "4"  "site1" "0"      
[17,] "4"  "site2" "0"      
[18,] "4"  "site3" "0"      
[19,] "4"  "site4" "1"      
[20,] "4"  "site5" "0"      
[21,] "5"  "site1" "0"      
[22,] "5"  "site2" "1"      
[23,] "5"  "site3" "0"      
[24,] "5"  "site4" "0"      
[25,] "5"  "site5" "0"      
[26,] "6"  "site1" "0"      
[27,] "6"  "site2" "0"      
[28,] "6"  "site3" "0"      
[29,] "6"  "site4" "1"      
[30,] "6"  "site5" "0"      
[31,] "7"  "site1" "0"      
[32,] "7"  "site2" "0"      
[33,] "7"  "site3" "1"      
[34,] "7"  "site4" "0"      
[35,] "7"  "site5" "0"      
[36,] "8"  "site1" "0"      
[37,] "8"  "site2" "0"      
[38,] "8"  "site3" "0"      
[39,] "8"  "site4" "0"      
[40,] "8"  "site5" "1"      
[41,] "9"  "site1" "0"      
[42,] "9"  "site2" "1"      
[43,] "9"  "site3" "0"      
[44,] "9"  "site4" "0"      
[45,] "9"  "site5" "0"      
[46,] "10" "site1" "1"      
[47,] "10" "site2" "0"      
[48,] "10" "site3" "0"      
[49,] "10" "site4" "0"      
[50,] "10" "site5" "0"
Другие вопросы по тегам