2014-09-02 3 views
0

두 개의 데이터 프레임이 있고 두 번째의 열 이름을 가진 다른 데이터 프레임을 새 데이터 프레임의 행으로 지정하고 싶습니다. 열 이름이 다르며 하나의 데이터 프레임에 더 많은 열이 있습니다. 예를 들어두 개의 데이터 프레임을 하나씩 합친 것

:

mydf1 <- data.frame(V1=c(1:5), V2=c(21:25)) 

mydf1 
    V1 V2 
1 1 21 
2 2 22 
3 3 23 
4 4 24 
5 5 25 

mydf2 <- data.frame(C1=c(1:10), C2=c(21:30),C3=c(41:50)) 

mydf2 
C1 C2 C3 
1 1 21 41 
2 2 22 42 
3 3 23 43 
4 4 24 44 
5 5 25 45 
6 6 26 46 
7 7 27 47 
8 8 28 48 
9 9 29 49 
10 10 30 50 

결과 :

mydf 
    V1 V2 
1 1 21 NA 
2 2 22 NA 
3 3 23 NA 
4 4 24 NA 
5 5 25 NA 
6 C1 C2 C3 
7 1 21 41 
8 2 22 42 
9 3 23 43 
10 4 24 44 
11 5 25 45 
12 6 26 46 
13 7 27 47 
14 8 28 48 
15 9 29 49 
16 10 30 50 

모든 숫자 값을 문자처럼 취급하면 난 상관하지 말아. 많은 감사

+0

하나의 큰 데이터 프레임을 내보내려고하므로 그 작업을하고 있습니다. taframes) 및 RDCOMClient 패키지를 통해 여러 워크 시트에 대한 많은 대형 데이터 프레임을 제공합니다. 필자는 dataframe을 write.table과 "append = T"와 결합하기 만했지만 여러 개의 워크 시트가 필요합니다. 도움이되었던 답변에 감사드립니다. –

답변

1

write.table으로 시도한 내용을 알지 못하지만 그 방법을 좋아합니다.

myFun <- function(...) { 
    L <- list(...) 
    temp <- tempfile() 
    maxCol <- max(vapply(L, ncol, 1L)) 
    lapply(L, function(x) 
    suppressWarnings(
     write.table(x, file = temp, row.names = FALSE, 
       sep = ",", append = TRUE))) 
    read.csv(temp, header = FALSE, fill = TRUE, 
      col.names = paste0("New_", sequence(maxCol)), 
      stringsAsFactors = FALSE) 
} 

사용

은 단순히 다음과 같습니다 :이 기능은 사용자가 입력으로 두 개 이상의 data.frame들 지정할 수 있도록 기록

myFun(mydf1, mydf2) 
# New_1 New_2 New_3 
# 1  V1 V2  
# 2  1 21  
# 3  2 22  
# 4  3 23  
# 5  4 24  
# 6  5 25  
# 7  C1 C2 C3 
# 8  1 21 41 
# 9  2 22 42 
# 10  3 23 43 
# 11  4 24 44 
# 12  5 25 45 
# 13  6 26 46 
# 14  7 27 47 
# 15  8 28 48 
# 16  9 29 49 
# 17 10 30 50 

이 같은 함수 뭔가를 만들 것입니다 :

mydf3 <- data.frame(matrix(1:8, ncol = 4)) 
myFun(mydf1, mydf2, mydf3) 
# New_1 New_2 New_3 New_4 
# 1  V1 V2    
# 2  1 21    
# 3  2 22    
# 4  3 23    
# 5  4 24    
# 6  5 25    
# 7  C1 C2 C3  
# 8  1 21 41  
# 9  2 22 42  
# 10  3 23 43  
# 11  4 24 44  
# 12  5 25 45  
# 13  6 26 46  
# 14  7 27 47  
# 15  8 28 48  
# 16  9 29 49  
# 17 10 30 50  
# 18 X1 X2 X3 X4 
# 19  1  3  5  7 
# 20  2  4  6  8 
+0

대단히 감사합니다. 정확히 내가 원하는 것입니다! –

2

당신은 어떤 패키지없이 쉽게 할 수 있습니다 물론

mydf1 <- data.frame(V1=c(1:5), V2=c(21:25)) 
mydf1[,3] <- NA 
names(mydf1) <- c("one", "two", "three") 
mydf2 <- data.frame(C1=c(1:10), C2=c(21:30),C3=c(41:50)) 
names <- t(as.data.frame(names(mydf2))) 
names <- as.data.frame(names) 
names(mydf2) <- c("one", "two", "three") 
names(names) <- c("one", "two", "three") 
mydf3 <- rbind(mydf1, names) 
mydf4 <- rbind(mydf3, mydf2) 

> mydf4 
one two three 
1 1 21 <NA> 
2 2 22 <NA> 
3 3 23 <NA> 
4 4 24 <NA> 
5 5 25 <NA> 
6 C1 C2 C3 
7 1 21 41 
8 2 22 42 
9 3 23 43 
10 4 24 44 
11 5 25 45 
12 6 26 46 
13 7 27 47 
14 8 28 48 
15 9 29 49 
16 10 30 50 
>  

, 당신은 당신이 원하는 무엇이든 마지막 열 이름을 만들기 위해 <- c("one", "two", "three")을 편집 할 수 있습니다. 예를 들어 실제 사용 사례에이를 확장 할 때 어떤 이유로 패키지를 의지해야하는 경우

> mydf1 <- data.frame(V1=c(1:5), V2=c(21:25)) 
> mydf1[,3] <- NA 
> names(mydf1) <- c("V1", "V2", "NA") 
> mydf2 <- data.frame(C1=c(1:10), C2=c(21:30),C3=c(41:50)) 
> names <- t(as.data.frame(names(mydf2))) 
> names <- as.data.frame(names) 
> names(mydf2) <- c("V1", "V2", "NA") 
> names(names) <- c("V1", "V2", "NA") 
> mydf3 <- rbind(mydf1, names) 
> mydf4 <- rbind(mydf3, mydf2) 
> row.names(mydf4) <- NULL 
> mydf4 
V1 V2 NA 
1 1 21 <NA> 
2 2 22 <NA> 
3 3 23 <NA> 
4 4 24 <NA> 
5 5 25 <NA> 
6 C1 C2 C3 
7 1 21 41 
8 2 22 42 
9 3 23 43 
10 4 24 44 
11 5 25 45 
12 6 26 46 
13 7 27 47 
14 8 28 48 
15 9 29 49 
16 10 30 50 

reshape2 또는 패키지 plyr에서 melt을 시도합니다. 그러나 패키지 사용은 필수적이지 않아야합니다.

1

여기에 rbind.fill 함수 (plyr 패키지의 일부)를 사용하는 방법이 있습니다.

library(plyr) 
setNames(rbind.fill(setNames(mydf1, names(mydf2[seq(mydf1)])), 
        rbind(names(mydf2), mydf2)), names(mydf1)) 

    V1 V2 NA 
1 1 21 <NA> 
2 2 22 <NA> 
3 3 23 <NA> 
4 4 24 <NA> 
5 5 25 <NA> 
6 C1 C2 C3 
7 1 21 41 
8 2 22 42 
9 3 23 43 
10 4 24 44 
11 5 25 45 
12 6 26 46 
13 7 27 47 
14 8 28 48 
15 9 29 49 
16 10 30 50 
1

이 기능을 사용해보십시오.

두 번째 데이터 집합의 열 이름을 벡터에 할당 한 다음 두 번째 집합의 이름을 첫 번째 집합의 이름으로 바꿉니다. 그런 다음 중간 요소가 지정한 벡터 인 목록을 만듭니다. 이제 rbind으로 전화를 걸면 모든 것이 올바른 순서로 이루어져야합니다.

d1$V3 <- NA 
nm <- names(d2) 
names(d2) <- names(d1) 
dc <- do.call(rbind, list(d1,nm,d2)) 
rownames(dc) <- NULL 
dc 
관련 문제