2016-11-15 1 views
4

여러 열로 한 열 dataframe 분할 5 개 이상의 세포가있다.R 나는 모든 국가 약어와 열이있는 dataframe을

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 
관련 문제