與標題一樣,描述起來很複雜,所以我只會顯示代碼,我得到的和我想要的。通過在數據表的行中添加條件創建新列R
set.seed(1)
df<-data.frame('X1'=rnorm(10),
'X2'=rnorm(10),
'X3'=c(c(rep('A',5)),c(rep('B',5))))
## create a bew column 'SPX2' which is the smallest positive number OF X2
## of each group(A and B)
require(data.table)
setDT(df)[X2>0,SPX2:=min(X2),by=X3]
df
然後我得到的結果爲:
X1 X2 X3 SPX2
1: -0.6264538 1.51178117 A 0.3898432
2: 0.1836433 0.38984324 A 0.3898432
3: -0.8356286 -0.62124058 A NA
4: 1.5952808 -2.21469989 A NA
5: 0.3295078 1.12493092 A 0.3898432
6: -0.8204684 -0.04493361 B NA
7: 0.4874291 -0.01619026 B NA
8: 0.7383247 0.94383621 B 0.5939013
9: 0.5757814 0.82122120 B 0.5939013
10: -0.3053884 0.59390132 B 0.5939013
和我要的是:
X1 X2 X3 SPX2
1: -0.6264538 1.51178117 A 0.3898432
2: 0.1836433 0.38984324 A 0.3898432
3: -0.8356286 -0.62124058 A 0.3898432
4: 1.5952808 -2.21469989 A 0.3898432
5: 0.3295078 1.12493092 A 0.3898432
6: -0.8204684 -0.04493361 B 0.5939013
7: 0.4874291 -0.01619026 B 0.5939013
8: 0.7383247 0.94383621 B 0.5939013
9: 0.5757814 0.82122120 B 0.5939013
10: -0.3053884 0.59390132 B 0.5939013
,因爲我想創建一個新列df$X4<-df$SPX2 - df$X2
,鄰需要任何其他操作如上所述,SPX2
。 我做了我的搜索,發現像here這樣的帖子,但這不是我在這裏嘗試做的。
任何人都知道如何做到這一點?
這應該工作:'setDT(df)[,SPX2:= min(X2 [X2> 0]),by = X3]'。我已經將條件添加到最小條款中,以便在大於零的所有X2上取最小值。 – jav
謝謝@jav,你的代碼被檢查,完美工作。永遠不要意識到這樣的強加條件,啓發!你爲什麼不把它當作答案,並且爲什麼我們可以在這裏爲需要它和我學習的其他人做一些解釋。順便說一句,我可以把它當作這個問題的答案。 –
感謝@Ronak Shah爲您的版本,它使問題更具可讀性和可理解性。我會在未來的帖子中注意到這些問題。 –