2016-12-16 6 views
0

키 열에 중복 기능을 사용하기 위해 spread() 기능을 사용하려고합니다. 예, 이전에는 다룰 수 있지만 보이지 않습니다. 그것을 작동 시키려면 나는 하루의 더 나은 부분을 (R에 다소 새로운) 보냈습니다.R 중복 기능이있는 스프레드 기능 - 일시적인 행을 추가 한 후에도 작동하지 않음

두 개의 데이터 열이 있습니다. 첫 번째 열 'snowday'는 겨울철 첫날을 나타내며 해당 눈의 깊이는 'depth'열에 표시됩니다. 이것은 수년 간의 데이터 (~ 62 년)입니다.

snowday row depth 
     1 1  0 
     1 2  0 
     1 3  0 
     1 4  0 
     1 5  0 
     1 6  0 
... 

     75 4633 24 
     75 4634  4 
     75 4635  6 
     75 4636 20 
     75 4637 29 
     75 4638  1 

내가 데이터 프레임보다 과도하게하는 "행"열을 추가 : 그래서 거기에 는이 snowday의 중복을 생산 칼럼 - snowday에 대한 일 등, 제 1, 제 2, 제 3의 육십이년해야한다 (나는 막연로 이해하는 그래서 하나 갈 는다 :. 총 측정 해 75 일째 육십이년 ~ 점령 4638 행을 지금은 폭을 확산하고 싶습니다 :

wide <- spread(seasondata, key = snowday, value = depth, fill = 0) 

와 나는 모두 0을 얻을 :

row 1 2 3 4 5 6 7 8 9 10 11 12 13 14 
1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 

내가보기에 원하는 것은 다음과 같습니다 (열은 "snowday"로 정의되고 행 값은 다양한 연도의 특정 날짜에 기록 된 다양한 깊이입니다. 일 1 ~ 11 :

1 2 3 4 5 6 7 8 9 10 11 12 13 14 
    2 1 3 4 0 0 1 0 2 8 9 19 0 3 
    0 8 0 0 0 4 0 6 6 0 1 0 2 0 
    3 5 0 0 0 2 0 1 0 2 7 0 12 4 

난 내가 = TRUE = TRUE 또는 변환 드롭을 통해 작업을 시도했습니다 여기 - 근본적으로 누락 된 뭔가를 생각 해요, 출력 값은 I 방식에 따라 하나 모두 제로 또는 NA의입니다 땜장이. 또한 data.frame (seasondata)의 모든 값은 정수입니다. 이견있는 사람?

+0

... 아주 간단 수정 될 것으로 보인다,하지만 난 몇 가지 간단한 단계를 누락 : 우리는 spread 사용할 수 . 감사하지만, 검색은 압도적 일 수 있지만 유인물을 묻는 대신 파기를 유지하는 것이 중요합니다 (이것이 바로 우리가 배우는 방법입니다 ... 맞습니까?) – user5691676

답변

0

여러분이하고 싶은 것은 depth 열을 snowday의 값에 따라 나누어서 75 개의 열을 모두 바인딩하는 것입니다.

62 * 75는 4638이 아니기 때문에 합병증이 있습니다. 그래서 나는 몇 년 동안 75 개의 스노우 데이를 관찰하지 않는다고 가정합니다. 즉, 75 개 기둥 중 일부 (스노우 데이)에는 62 개의 관측치가 없을 것입니다. 짧은 열을 NA 초로 채워서 75 개의 열이 모두 62 개의 항목으로 이루어져야합니다.

예를 들어 가짜 데이터를 만듭니다. 우리는 snowdays 1과 2에 대한 데이터의 3 "년"을 준수하지만 2 snowdays 3에 대한 데이터의 "년", 4

set.seed(1) 
seasondata <- data.frame(
    snowday = c(rep(1:2, each = 3), rep(3:4, each = 2)), 
    depth = round(runif(10, 0, 10), 0)) 
# snowday depth 
# 1  1  3 
# 2  1  4 
# 3  1  6 
# 4  2  9 
# 5  2  2 
# 6  2  9 
# 7  3  9 
# 8  3  7 
# 9  4  6 
# 10  4  1 

우리는 먼저 열을해야하는 시간을 알아낼. 귀하의 경우 m == 62. 내 예 : m == 3 (데이터 년).

m <- max(table(seasondata$snowday)) 

지금, 우리는 마침내 cbind 모든 열 함께 NAS가 짧은 컬럼을 snowdays의 값으로 depth을 분할하고 채우기 위해 by 기능을 사용하고 :

out <- do.call(cbind, 
    by(seasondata$depth, seasondata$snowday, 
    function(x) { 
     c(x, rep(NA, m - length(x))) 
    } 
) 
) 
out 
#  1 2 3 4 
# [1,] 3 9 9 6 
# [2,] 4 2 7 1 
# [3,] 6 9 NA NA 

spread 사용 :

원하는 경우 spread을 사용할 수 있습니다. 이 경우 row을 올바르게 정의해야합니다.row 지금 등 또한 초 초 snowday위한 첫 번째 snowday 2 1이어야 등 선입 snowday (snowday == 1) 제 제 snowday 2, row,

seasondata$row <- unlist(sapply(rle(seasondata$snowday)$lengths, seq_len)) 
seasondata 
# snowday depth row 
# 1  1  3 1 
# 2  1  4 2 
# 3  1  6 3 
# 4  2  9 1 
# 5  2  2 2 
# 6  2  9 3 
# 7  3  9 1 
# 8  3  7 2 
# 9  4  6 1 
# 10  4  1 2 

1이어야 난 그냥 올바른 값 출력을받지 못했습니다 추측 통해 검색을 살펴본

library(tidyr) 
spread(seasondata, key = snowday, value = depth, fill = NA) 
# row 1 2 3 4 
# 1 1 3 9 9 6 
# 2 2 4 2 7 1 
# 3 3 6 9 NA NA 
+0

감사합니다. 그것을 수정하는 여러 가지 방법을 시도했지만 며칠이 지났습니다. 좋은 경험은 - 많은 다른 기능/기술에 노출되었습니다! 다시 한 번 감사드립니다! do.call()에 노출되면 매우 유용합니다! – user5691676