簡體   English   中英

使用magrittr,dplyr和purrr有條件地將函數應用於R中的分組數據幀

[英]Conditionally applying functions to grouped dataframes in R with magrittr, dplyr and purrr

我想利用magrittr,dplyr和可能的purrr的簡潔性,用一個變量x拆分大型數據幀(具有許多不同類型的變量),然后按條件將x應用於每個組,並將組中的行應用於第二個變量變量y

取數據幀df <- data.frame(a, b, x, c, d, y) ,其中x是因子( foobar ), y是數字。 因此,我可以使用非管道式工作流來出色地描述我所描述的內容:

df$y[df$x == "foo"] %<>% subtract(min(.))
df$y[df$x == "bar"] %<>% add(max(df$y[df$x == "foo"]))

我想使用dplyr重寫它,並將其添加到df的長管道中,但是我所有嘗試結合mutatesapplydo嘗試都失敗了; 嘗試將purrr與匿名函數by_slicedmap

在此先非常感謝您的建議。

這比magrittr更為dplyr ,但我認為它也更具可讀性。 我對%<>%有點不滿意,因為它破壞了操作的線性結構,並使代碼更難閱讀。 所以我只在這里使用%>%

符合您的描述的示例數據框:

df <- data.frame(a = 'a', 
                 b = 'b', 
                 x = c("foo", "bar") , 
                 c = 'c', 
                 d = 'd', 
                 y = 1:6) 
df
  a b   x c d y
1 a b foo c d 1
2 a b bar c d 2
3 a b foo c d 3
4 a b bar c d 4
5 a b foo c d 5
6 a b bar c d 6

您的代碼:

library(dplyr)
library(magrittr)
df$y[df$x == "foo"] %<>% subtract(min(.))

df
  a b   x c d y
1 a b foo c d 0
2 a b bar c d 2
3 a b foo c d 2
4 a b bar c d 4
5 a b foo c d 4
6 a b bar c d 6

df$y[df$x == "bar"] %<>% add(max(df$y[df$x == "foo"]))

df
  a b   x c d  y
1 a b foo c d  0
2 a b bar c d  6
3 a b foo c d  2
4 a b bar c d  8
5 a b foo c d  4
6 a b bar c d 10

dplyr解決方案:

df %>% 
  mutate(y = ifelse(x == "foo", y - min(y), y)) %>% 
  mutate(y = ifelse(x == "bar", y + max(y[x == 'foo']), y))

  a b   x c d  y
1 a b foo c d  0
2 a b bar c d  6
3 a b foo c d  2
4 a b bar c d  8
5 a b foo c d  4
6 a b bar c d 10

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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