РЕДАКТИРОВАНИЕ: распространение данных на основе соответствия столбцов - PullRequest
0 голосов
/ 12 марта 2019

У меня есть пустой фрейм данных, который я пытаюсь заполнить.

Df1 выглядит так:

  col1 col2 col3 col4 important_col
1   82  193  104   86           120
2   85   68  116   63           100
3   78  145   10  132            28
4  121  158  103   15           109
5   48  175  168  190           151
6   91  136  156  180           155

Df2 выглядит так:

  1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
1 0 0 0 0 0 0 0 0 0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0
2 0 0 0 0 0 0 0 0 0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0
3 0 0 0 0 0 0 0 0 0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0
4 0 0 0 0 0 0 0 0 0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0
5 0 0 0 0 0 0 0 0 0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0
6 0 0 0 0 0 0 0 0 0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0

Aфрейм данных, заполненный 0.

Я объединяю фреймы данных, чтобы получить df_fin.

Теперь я пытаюсь сделать что-то похожее на фиктивный подход к переменным… Iиметь столбец в important_col.Я пытаюсь сделать spread этот столбец, поэтому, если important_col = 28, поместите 1 в столбец 28.

Как я могу создать это?

РЕДАКТИРОВАТЬ: я добавил комментарий, чтобы проиллюстрировать то, что я пытаюсь достичь.Я также вставляю это сюда.

Скажите, что важный_кол - это страны, тогда имена столбцов будут всеми странами в мире.Именно в этом примере все 241 страны мира.Однако данные, которые я, возможно, уже собрал, могли содержать только 200 из этих стран.Таким образом, one_hot_encoding даст мне 200 столбцов, но я пропускаю потенциально 41 страну.Поэтому, если новый пользователь из страны (которой нет в данных) приходит к данным и вводит свою страну, он не будет распознан

Меньший пример:

   col1 col2 col3 col4 important_col 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
1    11   14    3   11             1 0 0 0 0 0 0 0 0 0  0  0  0  0  0  0  0  0  0  0  0
2     1    1   19   15             4 0 0 0 0 0 0 0 0 0  0  0  0  0  0  0  0  0  0  0  0
3     3   17   10   10             6 0 0 0 0 0 0 0 0 0  0  0  0  0  0  0  0  0  0  0  0
4    13   10    8   17            10 0 0 0 0 0 0 0 0 0  0  0  0  0  0  0  0  0  0  0  0
5    18    5    3   18            19 0 0 0 0 0 0 0 0 0  0  0  0  0  0  0  0  0  0  0  0
6    11   10    9    5            17 0 0 0 0 0 0 0 0 0  0  0  0  0  0  0  0  0  0  0  0
7     5   11   18   16            17 0 0 0 0 0 0 0 0 0  0  0  0  0  0  0  0  0  0  0  0
8     5    8   13    8             6 0 0 0 0 0 0 0 0 0  0  0  0  0  0  0  0  0  0  0  0
9    10    1    7   16            12 0 0 0 0 0 0 0 0 0  0  0  0  0  0  0  0  0  0  0  0
10    4   17   17    3             4 0 0 0 0 0 0 0 0 0  0  0  0  0  0  0  0  0  0  0  0

Ожидаемый результат:

   col1 col2 col3 col4 important_col 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
1    11   14    3   11             1 1 0 0 0 0 0 0 0 0  0  0  0  0  0  0  0  0  0  0  0
2     1    1   19   15             4 0 0 0 1 0 0 0 0 0  0  0  0  0  0  0  0  0  0  0  0
3     3   17   10   10             6 0 0 0 0 0 1 0 0 0  0  0  0  0  0  0  0  0  0  0  0
4    13   10    8   17            10 0 0 0 0 0 0 0 0 0  1  0  0  0  0  0  0  0  0  0  0
5    18    5    3   18            19 0 0 0 0 0 0 0 0 0  0  0  0  0  0  0  0  0  0  1  0
6    11   10    9    5            17 0 0 0 0 0 0 0 0 0  0  0  0  0  0  0  0  1  0  0  0
7     5   11   18   16            17 0 0 0 0 0 0 0 0 0  0  0  0  0  0  0  0  1  0  0  0
8     5    8   13    8             6 0 0 0 0 1 0 0 0 0  0  0  0  0  0  0  0  0  0  0  0
9    10    1    7   16            12 0 0 0 0 0 0 0 0 0  0  0  1  0  0  0  0  0  0  0  0
10    4   17   17    3             4 0 0 0 1 0 0 0 0 0  0  0  0  0  0  0  0  0  0  0  0

Количество столбцов больше, чем количество потенциальных записей в important_col.Используя пример countries, в столбцах будут указаны все страны мира, а important_col будет состоять из подмножества этих стран.

Код для генерации вышеуказанного:

df1 <- data.frame(replicate(5, sample(1:20, 10, rep=TRUE)))
colnames(df1) <- c("col1", "col2", "col3", "col4", "important_col")
df2 <- data.frame(replicate(20, sample(0:0, nrow(df1), rep=TRUE)))
colnames(df2) <- gsub("X", "", colnames(df2))
df_fin <- cbind(df1, df2)
df_fin

Ответы [ 3 ]

1 голос
/ 12 марта 2019

Решает ли это проблему:

Данные:

set.seed(123)
df1 <- data.frame(replicate(5, sample(1:20, 10, rep=TRUE)))
colnames(df1) <- c("col1", "col2", "col3", "col4", "important_col")
df2 <- data.frame(replicate(20, sample(0:0, nrow(df1), rep=TRUE)))
colnames(df2) <- gsub("X", "", colnames(df2))
df_fin <- cbind(df1, df2)

Результат:

vecp <- colnames(df2)

imp_col <- df1$important_col

m <- matrix(vecp, byrow = TRUE, nrow = length(imp_col), ncol = length(vecp))

d <- ifelse(m == imp_col, 1, 0)

df_fin <- cbind(df1, d)

Вывод:

   col1 col2 col3 col4 important_col 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
1     6   20   18   20             3 0 0 1 0 0 0 0 0 0  0  0  0  0  0  0  0  0  0  0  0
2    16   10   14   19             9 0 0 0 0 0 0 0 0 1  0  0  0  0  0  0  0  0  0  0  0
3     9   14   13   14             9 0 0 0 0 0 0 0 0 1  0  0  0  0  0  0  0  0  0  0  0
4    18   12   20   16             8 0 0 0 0 0 0 0 1 0  0  0  0  0  0  0  0  0  0  0  0
5    19    3   14    1             4 0 0 0 1 0 0 0 0 0  0  0  0  0  0  0  0  0  0  0  0
6     1   18   15   10             3 0 0 1 0 0 0 0 0 0  0  0  0  0  0  0  0  0  0  0  0
7    11    5   11   16             5 0 0 0 0 1 0 0 0 0  0  0  0  0  0  0  0  0  0  0  0
8    18    1   12    5            10 0 0 0 0 0 0 0 0 0  1  0  0  0  0  0  0  0  0  0  0
9    12    7    6    7             6 0 0 0 0 0 1 0 0 0  0  0  0  0  0  0  0  0  0  0  0
10   10   20    3    5            18 0 0 0 0 0 0 0 0 0  0  0  0  0  0  0  0  0  1  0  0
0 голосов
/ 12 марта 2019

Как упомянул Сонни, model.matrix () должна делать эту работу. Одна потенциальная проблема заключается в том, что вам необходимо добавить обратно столбцы, которые не отображаются в вашем важный_кол, как в следующем случае:

df <- data.frame(important_col = as.factor(c(1:3, 5)))
df
  important_col
1             1
2             2
3             3
4             5
as.data.frame(model.matrix(~.-1, df))
  important_col1 important_col2 important_col3 important_col5
1              1              0              0              0
2              0              1              0              0
3              0              0              1              0
4              0              0              0              1

Col4 отсутствует во втором df, потому что важный_кол не содержит значения 4. Вы должны добавить обратно столбец 4, если он вам нужен для анализа.

0 голосов
/ 12 марта 2019

То, что вы пытаетесь сделать, это one hot encoding, которого вы легко можете достичь, используя model.matrix

Ниже приведен пример правильного направления:

df <- data.frame(important_col = as.factor(c(1:3)))
df

  important_col
1             1
2             2
3             3

as.data.frame(model.matrix(~.-1, df))
  important_col1 important_col2 important_col3
1              1              0              0
2              0              1              0
3              0              0              1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...