2016-12-01 28 views
1

假設我有3列,組1,組2一DF &可變分組超過2列和在計算隨後的組的利用價值

set.seed(1) 
group1 = c(rep(1,5),rep(2,5),rep(3,5),rep(4,5)) 
group2 = c("A","B","C","D","B","C","C","B","C","A","B","D") 
variable = c(as.integer(rnorm(20,2)**3)) 
df=data.frame(group1, group2, variable) 

我加入其中規定的列「MIN1」如果b的值'group1'內也存在於組1(x-1)中。副Versa加plus1。低於總數據幀:

group1 group2 variable min1 plus1 
1  1  A  3 0  0 
2  1  B  11 0  1 
3  1  C  2 0  1 
4  2  D  47 0  1 
5  2  B  13 1  1 
6  2  C  2 1  1 
7  3  C  16 1  0 
8  3  B  21 1  1 
9  3  C  18 1  0 
10  4  A  5 0  0 
11  4  B  44 1  0 
12  4  D  14 0  0 

現在我想做的計算如MAX()和SUM()(但也有一些更奇特的)上的變量,但不只是在自己的組別1 &內的所有值group2組合,但包括組之前(或之後)的值。 min1示例如下所示。

group1_min1 group2_min1 sum_min1 max_min1 
1   2   B  24  13 
2   2   C  4  2 
3   3   C  36  18 
4   3   B  34  21 
5   4   B  65  44 

注意,對於group1_min1(3),group2_min1(C)中使用三個值:行6,7 & 9(2,16 & 18)。

我嘗試使用GROUP_BY和dplyr中總結,是這樣的:

group_by(group1, group2) %>% 
summarize_each(funs(sum, max)) 

編輯:

我找到了解決之添加到原來的DF:

sum_min1 = c() 
j=0 
for (j in 1:(length(df$group1))){ 
    if (df[j,"min1"] == 0){sum_min1 = c(sum_min1,0)} else { 
    sum_min1 = c(sum_min1,(sum(df[which((df[,"group1"] == df[j,"group1"] | df[,"group1"] == (df[j,"group1"]-1)) & df[,"group2"]==(df[j,"group2"])),"variable"]))) 
    } 
} 
df = cbind(df,sum_min1) 

這提供輸出:

group1 group2 variable min1 plus1 sum_min1 
1   1 A  3 0  0  0 
2   1 B  11 0  1  0 
3   1 C  2 0  1  0 
4   2 D  47 0  0  0 
5   2 B  13 1  1  24 
6   2 C  2 1  1  4 
7   3 C  16 1  0  36 
8   3 B  21 1  1  34 
9   3 C  18 1  0  36 
10  4 A  5 0  0  0 
11  4 B  44 1  0  65 
12  4 D  14 0  0  0 

但是,這似乎是一個非常粗糙的方式,可能需要很長時間才能處理大數據集,實際上也存在多個變量和多個函數。這也可能是一個問題,因爲我想要做一些用戶定義的函數,其中包括for循環的所有值。

有沒有更好的方法來做到這一點?

對不起,我做錯了,我是R和StackOverflow的新手,而不是母語。

+0

什麼是b在'如果「內的B的值group1'' –

+0

而且其中規定的值,你說'group1(x-1)'是什麼意思?我不明白你的符號。 – JWLM

+0

如果我用字母改變group2,也許更容易。 如果在組1中(例如第1,2和3行(全1)或第4,5,6(全部2)),組2中有特定的字母(例如df [6,2] = C)檢查df [1:3,2]中是否存在C,因爲該組(值爲1)比組(C)(df [6,2])的組數小1,因此該行的值爲0. 第11行爲TRUE爲此,因爲B也在組1中(在第8行中值爲4-1 = 3) – Paul

回答

0
# Data 
set.seed(1) 
group1 = c(rep(1,3),rep(2,3),rep(3,3),rep(4,3)) 
group2 = c("A","B","C","D","B","C","C","B","C","A","B","D") 
variable = c(as.integer(rnorm(12,2)**3)) 
df=data.frame(group1, group2, variable) 

對於第一部分 -

df$min1 <- sapply(seq(nrow(df)), function(x) 
      { 
      if(df[x, "group1"] == 1){0} else { 
      max(df[x, "group2"] %in% df[df$group1 == df[x,"group1"] - 1,"group2"])} 
      }) 

df$plus1 <- sapply(seq(nrow(df)), function(x) 
      { 
      if(df[x, "group1"] == max(df$group1){0} else { 
      max(df[x, "group2"] %in% df[df$group1 == df[x,"group1"] + 1,"group2"])} 
      }) 

第二部分

df$sum_min1 <- sapply(seq(nrow(df)), function(x) 
       { 
       if(df[x, "group1"] == 1){0}else{ 
        sum(df[df$group1 == df[x,"group1"] & 
         df$group2 == df[x,"group2"],"variable"], 
         df[df$group1 == df[x,"group1"] - 1 & 
         df$group2 == df[x,"group2"],"variable"])} 
       }) 
+0

在第二部分中,我想對列變量中的值執行一些功能。他們應該採取的值如下: 組1中具有與組2相同值的所有值(因此第7和9行在組1中均爲'B',值爲3,它們的變量值爲16和18。然而,求和函數不僅應該考慮那些2,而且也應該考慮第6行,因爲它也具有值B,但是在小於行7和9的組中。總和應該是2 + 16 + 18。 也可以使用這些計算的列,但當min1或plus1也爲零時,也可以使用零。 – Paul

+0

檢查更新的腳本。如果有效,請將答案標記爲正確。 –