2017-02-09 2 views
1

목록과 데이터 프레임 사이의 변환을 이해하는 데 큰 어려움이 있습니다. 내가 성취하고자하는 간단한 예를 제시 할 것입니다. 포인트의 스냅 샷 인 데이터 프레임 목록이 있습니다.R 데이터 프레임의 데이터 프레임 목록

my_list <- list(data.frame(a = 1:5, b = c("a", "b", "c", "d", "f"), c= c("2015-01-01", "2015-01-01", "2015-01-01", "2015-01-01", "2015-01-01")), 
       data.frame(a = 1:5, b = c("a", "b", "c", "d", "f"), c= c("2015-02-01", "2015-02-01", "2015-02-01", "2015-02-01", "2015-02-01"))) 

다음 데이터 프레임으로 변환하고 싶습니다.

  a b c d f 
2015-01-01 1 2 3 4 5 
2015-02-01 1 2 3 4 5 

이 문제를 해결할 해결책이 있다면 데이터 프레임에서 원래 목록으로 돌아가십시오.

+3

"와이드 형식"과 "긴 형식"을 검색 – Bernhard

+0

사실 저는 reshape2를 사용하여 녹여서 dcast를 시도했지만 c (또는 date 열)는 힘든 시간을 주지만 감사합니다. – Viitama

답변

1

시도해 볼 수 있습니다 dcast().

그러나 먼저 데이터 프레임 목록을 data.tablerbindlist()을 사용하여 하나로 결합해야합니다.

library(data.table) 
dt_long <- rbindlist(my_list) 
dt_long 
# a b   c 
# 1: 1 a 2015-01-01 
# 2: 2 b 2015-01-01 
# 3: 3 c 2015-01-01 
# 4: 4 d 2015-01-01 
# 5: 5 f 2015-01-01 
# 6: 1 a 2015-02-01 
# 7: 2 b 2015-02-01 
# 8: 3 c 2015-02-01 
# 9: 4 d 2015-02-01 
#10: 5 f 2015-02-01 

dt_wide <- dcast(dt_long, c ~ b, value.var = "a") 
dt_wide 
#   c a b c d f 
#1: 2015-01-01 1 2 3 4 5 
#2: 2015-02-01 1 2 3 4 5 

역방향 동작 melt()이다

여전히 하나 data.table 열 결합하고 다음과 같이 조절 될 수있는 순서화가 행하더라도
melt(dt_wide, id.vars = "c", variable.name = "b", value.name = "a") 
#    c b a 
# 1: 2015-01-01 a 1 
# 2: 2015-02-01 a 1 
# 3: 2015-01-01 b 2 
# 4: 2015-02-01 b 2 
# 5: 2015-01-01 c 3 
# 6: 2015-02-01 c 3 
# 7: 2015-01-01 d 4 
# 8: 2015-02-01 d 4 
# 9: 2015-01-01 f 5 
#10: 2015-02-01 f 5 

는 :

setcolorder(dt_long2, letters[1:3]) 
dt_long2[order(c, a)] 
# a b   c 
# 1: 1 a 2015-01-01 
# 2: 2 b 2015-01-01 
# 3: 3 c 2015-01-01 
# 4: 4 d 2015-01-01 
# 5: 5 f 2015-01-01 
# 6: 1 a 2015-02-01 
# 7: 2 b 2015-02-01 
# 8: 3 c 2015-02-01 
# 9: 4 d 2015-02-01 
#10: 5 f 2015-02-01 

을 완성하려면 역방향 동작 인 경우 큰 data.table은 다음 중 작은 수의 목록으로 나눌 수 있습니다.

lapply(unique(dt_long2$c), function(x) dt_long2[c == x]) 
#[[1]] 
# a b   c 
#1: 1 a 2015-01-01 
#2: 2 b 2015-01-01 
#3: 3 c 2015-01-01 
#4: 4 d 2015-01-01 
#5: 5 f 2015-01-01 
# 
#[[2]] 
# a b   c 
#1: 1 a 2015-02-01 
#2: 2 b 2015-02-01 
#3: 3 c 2015-02-01 
#4: 4 d 2015-02-01 
#5: 5 f 2015-02-01 

여기서, c이 식별 변수라고 가정한다.

+0

감사합니다. 한 번에 한 번씩 개별 목록을 해결하려고했습니다. 거꾸로하는 방법을 생각해? – Viitama

+0

@Viitama 역순으로 추가되었습니다. 이거 괜찮 니? 또는 이것을 다시 단일 데이터 프레임으로 분할해야합니까? – Uwe

+0

그 목록 형식으로 다시 작동합니다. 감사! – Viitama

관련 문제