簡體   English   中英

使用多個條件使用dplyr進行變異

[英]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.tabledplyr為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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM