Изменить порядок данных с помощью поднабора и привязки столбцов
У меня есть следующий фрейм данных:
st <- data.frame(
se = rep(1:2, 5),
X = rnorm(10, 0, 1),
Y = rnorm(10, 0, 2))
st$xy <- paste(st$X,",",st$Y)
st <- st[c("se","xy")]
но я хочу, чтобы это было следующим:
1 2 3 4 5
-1.53697673029089 , 2.10652020463275 -1.02183940974772 , 0.623009466458354 1.33614674072657 , 1.5694345481646 0.270466789820086 , -0.75670874554064 -0.280167896821629 , -1.33313822867893
0.26012874418111 , 2.87972571647846 -1.32317949800031 , -2.92675188421021 0.584199000313255 , 0.565499464846637 -0.555881716346136 , -1.14460518414649 -1.0871665543915 , -3.18687136890236
Я имею в виду, когда значение se
то же самое, сделать привязку столбца.
У вас есть идеи, как этого добиться? Мне не повезло с spread(tidyr)
и я думаю, что это sapply
, cbind
и if
заявление. Потому что реальные данные включают более 35 000 строк.
2 ответа
Кажется, что ваша конечная цель состоит в том, чтобы иметь файл данных, который имеет примерно 35000 столбцов. Вы уверены, что? Это звучит не очень аккуратно.
Чтобы делать то, что вы хотите, вам понадобится идентификатор строки. Ниже я назвал это caseid, а затем удалил его, как только он больше не требовался. Затем я переношу результат, чтобы получить то, что вы просили.
library(tidyr)
library(dplyr)
st <- data.frame(
se = rep(1:2, 5),
X = rnorm(10, 0, 1),
Y = rnorm(10, 0, 2))
st$xy <- paste(st$X,",",st$Y)
st <- st[c("se","xy")]
st$caseid = rep(1:(nrow(st)/2), each = 2) # temporary
df = spread(st, se, xy) %>%select(-caseid) %>%t()
print(df)
Если нам нужно разделить элементы столбца "ху" на отдельные единицы, cSplit
от splitstackshape
может быть использован. затем rbind
чередующиеся строки 'st1' после unlist
ing`.
library(splitstackshape)
st1 <- cSplit(st, 'xy', ', ', 'wide')
rbind(unlist(st1[c(TRUE,FALSE)][,-1, with=FALSE]),
unlist(st1[c(FALSE, TRUE)][,-1, with=FALSE]))
Если нам не нужно split
столбец "ху" на отдельные элементы, мы можем использовать dcast
от data.table
, Это должно быть достаточно быстро. Преобразовать data.frame в data.tablesetDT(st)
создайте столбец последовательности ('N') с помощью 'se', а затем dcast
от "длинного" до "широкого".
library(data.table)
dcast(setDT(st)[, N:= 1:.N, se], se~N, value.var= 'xy')