假設我有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的新手,而不是母語。
什麼是b在'如果「內的B的值group1'' –
而且其中規定的值,你說'group1(x-1)'是什麼意思?我不明白你的符號。 – JWLM
如果我用字母改變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