繁体   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