Преобразовать кадр данных в R - PullRequest
0 голосов
/ 08 апреля 2020

Можем ли мы преобразовать эти данные, как показано в ожидаемом результате?

ColA   ColB  ColC
A        -    0
B        X    3
C        Y    4 
D        X    51
D        Y    32

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

ColA     X    Y
A        0    0
B        3    0
C        0    4 
D        51   32

Ответы [ 3 ]

2 голосов
/ 08 апреля 2020

Да, мы можем. Использование xtabs:

res <- xtabs(ColC ~ ColA + ColB, dat)[,-1]
#     ColB
# ColA  X  Y
#    A  0  0
#    B  3  0
#    C  0  4
#    D 51 32

Чтобы получить фрейм данных, выполните:

res <- as.data.frame(unclass(res))
res
#    X  Y
# A  0  0
# B  3  0
# C  0  4
# D 51 32

Или все в одном:

res <- as.data.frame(unclass(xtabs(ColC ~ ColA + ColB, dat)[,-1]))

Данные

dat <- structure(list(ColA = c("A", "B", "C", "D", "D"), ColB = c("-", 
"X", "Y", "X", "Y"), ColC = c(0L, 3L, 4L, 51L, 32L)), row.names = c(NA, 
-5L), class = "data.frame")
2 голосов
/ 08 апреля 2020

Краткое решение на основе data.table (наиболее рекомендуемый вариант, если у вас есть объемные данные)

colA = c("A","B","C","D","D")
colB = c(NA,"X","Y","X","Y")
colC = c(0,3,4,51,32)

library(data.table)

dt <- data.table(colA = colA, colB = colB, colC = colC)

dt <- dcast(dt, colA ~ ..., fill = 0)
dt[,"NA" := NULL]

dt
   colA  X  Y
1:    A  0  0
2:    B  3  0
3:    C  0  4
4:    D 51 32

dcast переводит ваши данные в длинный и широкий формат.

2 голосов
/ 08 апреля 2020

Возможно, что-то вроде этого:

library(dplyr)
library(tidyr)

df %>%
  mutate_at(vars(ColB:ColC), ~replace(., . == '-', 'X')) %>%
  pivot_wider(names_from = ColB, values_from = ColC, values_fill = list(ColC = 0))

#  ColA  X     Y    
#  <fct> <chr> <chr>
#1 A     0     0    
#2 B     3     0    
#3 C     0     4    
#4 D     51    32   

данные

df <- structure(list(ColA = structure(c(1L, 2L, 3L, 4L, 4L), .Label = c("A", 
"B", "C", "D"), class = "factor"), ColB = structure(c(1L, 2L, 
3L, 2L, 3L), .Label = c("-", "X", "Y"), class = "factor"), ColC = c(0L, 
3L, 4L, 51L, 32L)), class = "data.frame", row.names = c(NA, -5L))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...