Сортировать данные по коду в столбце в R
У меня есть файл с двумя столбцами. Один с 5-значным кодом и один с количеством. Вот пример с 3 цифрами:
Code Count
101 1254
103 1566
221 459
213 698
Теперь я хотел бы переместить данные так, чтобы они сортировались после того кода, начинающегося с последней цифры:
10x 11x 12x 13x 14x .... 19x 20x 21x 22x 23x
xx1 1254 459
xx2
xx3 1566 698
Любая помощь приветствуется.
2 ответа
Решение
Учитывая ваш пример, вы можете сделать что-то вроде этого:
df$code_2 <- substr(df$Code, 1, 2)
df$code_1 <- substring(df$Code, 3)
Который выглядит как:
> df
Code Count code_2 code_1
1 101 1254 10 1
2 103 1566 10 3
3 221 459 22 1
4 213 698 21 3
А потом dcast
library(reshape2)
dcast(df, code_1 ~ code2, value.var = 'Count')
code_1 10 21 22
1 1 1254 NA 459
2 3 1566 698 NA
И правильно отформатировать его:
rownames(df2) <- paste0('xx', df2$code_1)
df2$code_1 <- NULL
names(df2) <- paste0(names(df2), 'x')
Выход:
df2
10x 21x 22x
xx1 1254 NA 459
xx3 1566 698 NA
В качестве альтернативы вы можете сделать:
# create a sample dataset
data <- data.frame(Code = c(101,103,221,213), Count = c(1254,1566,459,698))
# extract code start and end
start <- sort(unique(substr(data$Code, 1,2)))
end <- sort(unique(substr(data$Code, 3,3)))
# create placeholder dataframe
data2 <- sapply(start, paste0, end)
# where code not in original dataset, write NA
data2[!sapply(c(data2), '%in%', data$Code)] <- NA
# else write the appropriate count
data2[sapply(c(data2), '%in%', data$Code)] <- data$Count[order(data$Code)]
# change column and row names
colnames(data2) <- paste0(start, "x")
rownames(data2) <- paste0("xx", end)
Но я бы догадался dcast
как в ответе LyzandeR более элегантно.