[英]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
是因子( foo
, bar
), y
是數字。 因此,我可以使用非管道式工作流來出色地描述我所描述的內容:
df$y[df$x == "foo"] %<>% subtract(min(.))
df$y[df$x == "bar"] %<>% add(max(df$y[df$x == "foo"]))
我想使用dplyr重寫它,並將其添加到df
的長管道中,但是我所有嘗試結合mutate
, sapply
和do
嘗試都失敗了; 嘗試將purrr與匿名函數by_slice
和dmap
。
在此先非常感謝您的建議。
這比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.