2016-11-15 5 views
4

у меня есть dataframe, который колонна со всеми государственными сокращениями:R - Сплит один столбец dataframe а на несколько столбцов

Name 
AK 
AL 
AR 
AZ 
CO 
CT 
DC 
FL 

Я хочу взять эту колонку и разделить его на несколько столбцов таким образом, что нет колонки имеет более 5 клеток.

Name1 Name2 
AK  CT 
AL  DC 
AR  FL 
AZ 
CO 

Я могу создать код для того, что я хочу сделать, но там должен быть лучший способ:

states <- as.data.frame(state.abb) 

new.table <- as.data.frame(states[1:5,]) 

i <- 6 
k <- 2 

repeat{ 
    new.table[,k] <- as.data.frame(states[(i):(i+4),]) 
    i <- i + 5 
    k <- k + 1 
    if(i>nrow(states)){ 
    break 
    } 
} 

ответ

5

Если NA нормально использовать для пустых значений, то мы можем сделать следующие. Предполагая, что ваши данные называются df, мы можем сначала создать вектор значений, которые будут использоваться для разделения данных.

(x <- rep(1:ceiling(nrow(df)/5), each = 5, length.out = nrow(df))) 
# [1] 1 1 1 1 1 2 2 2 

Теперь мы можем разделить данные, закодировать результирующий список, чтобы каждый элемент имел длину 5 и принуждение к кадру данных. Названия столбцов создаются на лету здесь. Возможно, более эффективно их создать позже.

as.data.frame(lapply(split(df$Name, paste0(names(df), x)), "length<-", 5)) 
# Name1 Name2 
# 1 AK CT 
# 2 AL DC 
# 3 AR FL 
# 4 AZ <NA> 
# 5 CO <NA> 
7

Подобно @ RichScriven концепт-, но с использованием matrix, чтобы иметь дело с перепрофилирования:

columniser <- function(x, n) { 
    m <- matrix(NA, nrow=n, ncol=ceiling(length(x)/n)) 
    m[1:length(x)] <- x 
    as.data.frame(m) 
} 

columniser(states$state.abb, 5) 
# V1 V2 V3 V4 V5 V6 V7 V8 V9 V10 
#1 AL CO HI KS MA MT NM OK SD VA 
#2 AK CT ID KY MI NE NY OR TN WA 
#3 AZ DE IL LA MN NV NC PA TX WV 
#4 AR FL IN ME MS NH ND RI UT WI 
#5 CA GA IA MD MO NJ OH SC VT WY 

columniser(1:12, 5) 
# V1 V2 V3 
#1 1 6 11 
#2 2 7 12 
#3 3 8 NA 
#4 4 9 NA 
#5 5 10 NA 
Смежные вопросы