2017-05-29 87 views
0

這裏我data.frame的示例創建重複展開data.frame:通過基於羣組條件

df = read.table(text = 'ID Day Count Count_group 
1001 1933 6 11 
1002 1933 6 11 
1003 1933 6 11 
1004 1933 6 11 
1005 1933 6 11 
1006 1933 6 11 
1007 1932 5 8 
1008 1932 5 8 
1009 1932 5 8 
1010 1932 5 8 
1011 1932 5 8 
1012 1931 3 4 
1013 1931 3 4 
1014 1931 3 4 
1015 1930 1 1 
1016 1800 6 10 
1017 1800 6 10 
1018 1800 6 10 
1019 1800 6 10 
1020 1800 6 10 
1021 1800 6 10 
1022 1799 4 6 
1023 1799 4 6 
1024 1799 4 6 
1025 1799 4 6 
1026 1798 2 2 
1027 1798 2 2 
1028 888  4 6 
1029 888  4 6 
1030 888  4 6 
1031 888  4 6 
1032 887  2 3 
1033 887  2 3 
1034 886  1 2 
1035 885  1 1', header = TRUE) 

Count COL顯示每每個DayID值和Count_group欄的總數示出的總和的ID值每個DayDay - 1

例如1933 = Count_group 11因爲Count 6(1933)+ Count 5(1932)等等。

我需要做的是創造每每個Count_group重複的意見,並把它們添加到它,以每各Count_groupDayDay - 1顯現。

例如需要Count_group = 11通過的Day 1933和1932因此,無論天Count值由要被包括在所述Count_group = 11 下一個將是Count_group = 8,由1932和1931組成,等...

預期輸出:

ID  Day Count Count_group 
1001 1933 6 11 
1002 1933 6 11 
1003 1933 6 11 
1004 1933 6 11 
1005 1933 6 11 
1006 1933 6 11 
1007 1932 5 11 
1008 1932 5 11 
1009 1932 5 11 
1010 1932 5 11 
1011 1932 5 11 
1007 1932 5 8 
1008 1932 5 8 
1009 1932 5 8 
1010 1932 5 8 
1011 1932 5 8 
1012 1931 3 8 
1013 1931 3 8 
1014 1931 3 8 
1012 1931 3 4 
1013 1931 3 4 
1014 1931 3 4 
1015 1930 1 4 
1015 1930 1 1 
1016 1800 6 10 
1017 1800 6 10 
1018 1800 6 10 
1019 1800 6 10 
1020 1800 6 10 
1021 1800 6 10 
1022 1799 4 10 
1023 1799 4 10 
1024 1799 4 10 
1025 1799 4 10 
1022 1799 4 6 
1023 1799 4 6 
1024 1799 4 6 
1025 1799 4 6 
1026 1798 2 6 
1027 1798 2 6 
1026 1798 2 2 
1027 1798 2 2 
1028 888 4 6 
1029 888 4 6 
1030 888 4 6 
1031 888 4 6 
1032 887 2 6 
1033 887 2 6 
1032 887 2 3 
1033 887 2 3 
1034 886 1 3 
1034 886 1 2 
1035 885 1 2 
1035 885 1 1 

你有什麼建議嗎?

+0

好吧,我會添加更多的信息。謝謝 – aaaaa

+0

@akrun info已被添加。謝謝 – aaaaa

+0

謝謝,與其他的東西忙碌:-)這意味着'天'不是一個分組變量 – akrun

回答

1

我認爲這確實你需要什麼...

#first add a grouping variable 
df$daygroup <- c(0,cumsum(sapply(2:nrow(df),function(i) df$Day[i]!=df$Day[i-1]))) 

#split df into a list of data frames, loop through them to add extra rows, 
#and bind them back together 
df2 <- do.call(rbind,lapply(split(df,df$daygroup),function(x){ 
    n <- nrow(x) 
    m <- x$Count_group[1] #number of rows needed for Day 
    if(m>n){ 
    y <- rbind(x,data.frame(ID=(x$ID[n]+1):(x$ID[n]+m-n), #continue numbering 
          Day=x$Day[1]-1, #previous day 
          Count=m-x$Count[1], #difference in count 
          Count_group=m, 
          daygroup=x$daygroup[1])) 
    } else { 
    y <- x #no extra rows needed 
    } 
    return(y) 
} 
)) 
df2$daygroup <- NULL #remove grouping variable 


head(df2,20) #ignore the rownames! 
     ID Day Count Count_group 
0.1 1001 1933  6   11 
0.2 1002 1933  6   11 
0.3 1003 1933  6   11 
0.4 1004 1933  6   11 
0.5 1005 1933  6   11 
0.6 1006 1933  6   11 
0.7 1007 1932  5   11 
0.8 1008 1932  5   11 
0.9 1009 1932  5   11 
0.10 1010 1932  5   11 
0.11 1011 1932  5   11 
1.7 1007 1932  5   8 
1.8 1008 1932  5   8 
1.9 1009 1932  5   8 
1.10 1010 1932  5   8 
1.11 1011 1932  5   8 
1.1 1012 1931  3   8 
1.2 1013 1931  3   8 
1.3 1014 1931  3   8 
2.12 1012 1931  3   4 
+0

嗨,非常感謝。我更新了這個問題,你應該很容易調整代碼。 1)如果我的身份證號碼不是按順序排列,並且可以在不同的日期內重複,該怎麼辦? 2)如何將代碼適應不同的數據框架,將不同的時間窗口視爲分組條件?即我應該更改哪部分代碼以及如何更改。謝謝 – aaaaa

+0

新問題在這裏https://stackoverflow.com/questions/44242299/expand-data-frame-by-creating-duplicates-based-on-group-condition-2謝謝.. – aaaaa

+1

我已經添加了一個答案給你關於第一部分關於ID值的新問題。對於較長時間,我不清楚正確的輸出是什麼樣子。 –