#r #pivot
Вопрос:
У меня есть таблица следующего типа:
ОЭЗ | Класс | Вэл |
---|---|---|
1_1_1 | 1 | 2 |
1_1_1 | 5 | 2 |
1_1_2 | 5 | 2 |
1_1_3 | 1 | 1 |
1_1_3 | 5 | 2 |
1_1_4 | 1 | 1 |
1_1_5 | 2 | 1 |
1_2_1 | 1 | 2 |
1_2_1 | 5 | 2 |
Чтобы распространить столбец «Класс» на несколько новых столбцов, получая значение из столбца «Val», я использовал pivot_wider, и все прошло хорошо. Я ввел этот код:
pivot_wider(names_from = Class, values_from = Val, names_sort=T, values_fill = list(n = 0))
получение такого результата:
Оэз | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
---|---|---|---|---|---|---|---|
1_1_1 | 2 | 0 | 0 | 0 | 2 | 0 | 0 |
1_1_2 | 0 | 0 | 0 | 0 | 2 | 0 | 0 |
1_1_3 | 1 | 0 | 0 | 0 | 2 | 0 | 0 |
К сожалению, мне приходится использовать внешний компьютер, на котором присутствуют только базовые пакеты R, и время для запроса дополнительных пакетов не является коротким.
Я попытался использовать это решение:
newdata <- xtabs(dat$Val ~ dat$Sez dat$Class)
Но это дает мне распределение частот с каждой строкой:
ОЭЗ | Класс | Част. |
---|---|---|
1_1_1 | 1 | 2 |
1_1_2 | 1 | 0 |
1_1_3 | 1 | 1 |
1_1_4 | 1 | 1 |
1_1_5 | 1 | 0 |
1_2_1 | 1 | 1 |
Я ищу решение с базовой функцией R, которое дает мне объект, равный тому, который используется с помощью pivot_wider.
Ответ №1:
Мы создаем «Класс» как factor
и используем xtabs
df1$Class <- factor(df1$Class, levels = 1:7)
xtabs(Val ~ SEZ Class, df1)
-выход
Class
SEZ 1 2 3 4 5 6 7
1_1_1 2 0 0 0 2 0 0
1_1_2 0 0 0 0 2 0 0
1_1_3 1 0 0 0 2 0 0
1_1_4 1 0 0 0 0 0 0
1_1_5 0 1 0 0 0 0 0
1_2_1 2 0 0 0 2 0 0
Если нам нужен data.frame
выход
out <- as.data.frame.matrix( xtabs(Val ~ SEZ Class, df1))
out$SEZ <- row.names(out)
row.names(out) <- NULL
данные
df1 <- structure(list(SEZ = c("1_1_1", "1_1_1", "1_1_2", "1_1_3", "1_1_3",
"1_1_4", "1_1_5", "1_2_1", "1_2_1"), Class = c(1L, 5L, 5L, 1L,
5L, 1L, 2L, 1L, 5L), Val = c(2L, 2L, 2L, 1L, 2L, 1L, 1L, 2L,
2L)), row.names = c(NA, -9L), class = "data.frame")
Комментарии:
1. Привет, большое вам спасибо за ваш ответ. Ваше решение очень хорошее, однако, когда я пытаюсь создать новую переменную: new_variable Я не знаю, ошибаюсь ли я в чем-то!
2. @Antonio вам нужен ouptu, как в обновлении
3. Akrun ваше решение-это то, что я пытался получить из данных, оно хорошо работает! Большое спасибо!!
Ответ №2:
Другой базовый вариант R с использованием reshape
merge
reshape(
merge(df,
expand.grid(
SEZ = unique(df$SEZ),
Class = 1:7
),
all = TRUE
),
direction = "wide",
idvar = "SEZ",
timevar = "Class"
)
дает
SEZ Val.1 Val.2 Val.3 Val.4 Val.5 Val.6 Val.7
1 1_1_1 2 NA NA NA 2 NA NA
8 1_1_2 NA NA NA NA 2 NA NA
15 1_1_3 1 NA NA NA 2 NA NA
22 1_1_4 1 NA NA NA NA NA NA
29 1_1_5 NA 1 NA NA NA NA NA
36 1_2_1 2 NA NA NA 2 NA NA
Комментарии:
1. Привет, Томас, спасибо тебе за твой ответ и решение!