【问题标题】:dplyr how to do the rowwise conditional mutate operationdplyr 如何进行逐行条件变异操作
【发布时间】:2017-12-18 19:39:01
【问题描述】:

我想在 iris 表中增加一列,这样在同一个 Species 中,第一行是 NA,如果 Petal.Width 与最后一行(正上方的行)相同,则其余行是 1,如果 Petal.Width 与最后一行不同,则为 0。

如何使用 dplyr 实现这一目标?需要更改下面的列。

   Sepal.Length Sepal.Width Petal.Length Petal.Width Species Change
1          5.1         3.5          1.4         0.2  setosa   NA
2          4.9         3.0          1.4         0.2  setosa   0
3          4.7         3.2          1.3         0.2  setosa   0
4          4.6         3.1          1.5         0.2  setosa   0
5          5.0         3.6          1.4         0.2  setosa   0
6          5.4         3.9          1.7         0.4  setosa   1

【问题讨论】:

  • iris %>% group_by(Species) %>% mutate(Change = Petal.Width - lag(Petal.Width) != 0);如果您愿意,请加入as.integer。等效地,c(NA, diff(Petal.Width) != 0)
  • hm,实际上as.integer(Petal.Width != lag(Petal.Width)) 的可读性更强,但我仍然认为如果是这样的话,最好保持逻辑性

标签: r dplyr tidyverse


【解决方案1】:

dplyr 有一个lag() 函数:

 iris %>% group_by(Species) %>% 
   mutate(Change = ifelse(lag(Petal.Width)==Petal.Width,0,1))

# A tibble: 150 x 6
# Groups:   Species [3]
   Sepal.Length Sepal.Width Petal.Length Petal.Width Species Change
          <dbl>       <dbl>        <dbl>       <dbl>  <fctr>  <dbl>
 1          5.1         3.5          1.4         0.2  setosa     NA
 2          4.9         3.0          1.4         0.2  setosa      0
 3          4.7         3.2          1.3         0.2  setosa      0
 4          4.6         3.1          1.5         0.2  setosa      0
 5          5.0         3.6          1.4         0.2  setosa      0
 6          5.4         3.9          1.7         0.4  setosa      1
 7          4.6         3.4          1.4         0.3  setosa      1
 8          5.0         3.4          1.5         0.2  setosa      1
 9          4.4         2.9          1.4         0.2  setosa      0
10          4.9         3.1          1.5         0.1  setosa      1

【讨论】:

  • 这是一个非常好的解决方案
猜你喜欢
  • 1970-01-01
  • 2018-11-30
  • 2014-04-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-14
  • 2020-08-05
  • 2018-06-24
相关资源
最近更新 更多