2017-08-14 30 views
4

與標題一樣,描述起來很複雜,所以我只會顯示代碼,我得到的和我想要的。通過在數據表的行中添加條件創建新列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這樣的帖子,但這不是我在這裏嘗試做的。

任何人都知道如何做到這一點?

+3

這應該工作:'setDT(df)[,SPX2:= min(X2 [X2> 0]),by = X3]'。我已經將條件添加到最小條款中,以便在大於零的所有X2上取最小值。 – jav

+2

謝謝@jav,你的代碼被檢查,完美工作。永遠不要意識到這樣的強加條件,啓發!你爲什麼不把它當作答案,並且爲什麼我們可以在這裏爲需要它和我學習的其他人做一些解釋。順便說一句,我可以把它當作這個問題的答案。 –

+0

感謝@Ronak Shah爲您的版本,它使問題更具可讀性和可理解性。我會在未來的帖子中注意到這些問題。 –

回答

2

tidyverse替代:

df %>% 
    group_by(X3) %>% 
    mutate(SPX2 = min(X2[X2>0])) 

其給出:

  X1   X2  X3  SPX2 
     <dbl>  <dbl> <fctr>  <dbl> 
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 
+0

謝謝@Aramis7d,很好的解決方案,我把它當成了這個問題的答案。 –

1

使用data.table包:

setDT(df)  
df[,SPX2:=min(X2[X2 > 0]),by=X3] 

這樣做是爲X3每個值,子集上的正值的X2(即X2[X2 > 0]),然後取所有正值的最小值。請注意,如果沒有正值(即X2[X2 > 0]爲空),則結果值將爲Inf。請記住這一點,特別是如果你想使用SPX2進行任何進一步的計算。

根據你的問題,爲什麼X2[X2 > 0]有效,請考慮如下:對於X3的每個值,返回相應值的向量X2。現在,您可以對此矢量執行常規矢量運算,其中之一是通過X2 > 0進行子集處理。它的工作方式如下:

x2 = c(-1, 1, 2, 3, -2, 4) 
x2[x2 > 0] 
# [1] 1 2 3 4 

希望這有助於!

相關問題