[英]Mutate with dplyr using multiple conditions
我有一個數據框(df),我想添加一個額外的列, result
,使用dplyr,如果z == "gone"
將取值1,其中x
是組y
的最大值。
y x z
1 a 3 gone
2 a 5 gone
3 a 8 gone
4 a 9 gone
5 a 10 gone
6 b 1
7 b 2
8 b 4
9 b 6
10 b 7
如果我只是為每個組選擇最大值,它將是:
df %>%
group_by(y) %>%
slice(which.max(x))
將返回:
y x z
1 a 10 gone
2 b 7
這不是我想要的。 我需要利用y
每個組的x
的最大值,同時檢查是否z == "gone"
,如果為TRUE
1,否則為0.這看起來像:
y x z result
1 a 3 gone 0
2 a 5 gone 0
3 a 8 gone 0
4 a 9 gone 0
5 a 10 gone 1
6 b 1 0
7 b 2 0
8 b 4 0
9 b 6 0
10 b 7 0
我假設我會在mutate()
使用條件語句,但我似乎無法找到一個例子。 請指教。
我們可以使用data.table
來做到這data.table
。 我們將'data.frame'轉換為'data.table'( setDT(df)
),按'y'分組,我們創建'x'的最大值和'z'中'gone'元素的邏輯條件,將其強制轉換為'integer'( as.integer
)並將輸出分配( :=
)到新列('result')。
library(data.table)
setDT(df)[, result := as.integer(x==max(x) & z=='gone') , by = y]
df
# y x z result
# 1: a 3 gone 0
# 2: a 5 gone 0
# 3: a 8 gone 0
# 4: a 9 gone 0
# 5: a 10 gone 1
# 6: b 1 0
# 7: b 2 0
# 8: b 4 0
# 9: b 6 0
#10: b 7 0
或者我們可以使用base R
ave
df$result <- with(df, +(ave(x, y, FUN=max)==x & z=='gone' ))
使用dplyr
您可以使用:
df %>% group_by(y) %>% mutate(result = +(x == max(x) & z == 'gone'))
+(..)
表示法是as.integer
簡寫,用於將邏輯輸出強制轉換為1和0。 有些人不喜歡它,所以這是一個較短的代碼與可讀性的問題。 效率增益可以在這種情況下進行辯論。
還要了解data.table
和dplyr
為R進行數據操作所做的事情,讓我們用老式的“split-apply-combine”方式做同樣的事情:
#split data.frame by group
split.df <- split(df, df$y)
#apply required function to each group
lst <- lapply(split.df, function(dfx) {
dfx$result <- +(dfx$x == max(dfx$x) & dfx$z == "gone")
dfx})
#combine result in new data.frame
newdf <- do.call(rbind, lst)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.