dplyr包可以用于条件变异吗?

dplyr包可以用于条件变异吗?

当突变是有条件的(取决于某些列值的值)时,可以使用mutate吗?


这个例子有助于显示我的意思。


structure(list(a = c(1, 3, 4, 6, 3, 2, 5, 1), b = c(1, 3, 4, 

2, 6, 7, 2, 6), c = c(6, 3, 6, 5, 3, 6, 5, 3), d = c(6, 2, 4, 

5, 3, 7, 2, 6), e = c(1, 2, 4, 5, 6, 7, 6, 3), f = c(2, 3, 4, 

2, 2, 7, 5, 2)), .Names = c("a", "b", "c", "d", "e", "f"), row.names = c(NA, 

8L), class = "data.frame")


  a b c d e f

1 1 1 6 6 1 2

2 3 3 3 2 2 3

3 4 4 6 4 4 4

4 6 2 5 5 5 2

5 3 6 3 3 6 2

6 2 7 6 7 7 7

7 5 2 5 2 6 5

8 1 6 3 6 3 2

我希望使用dplyr包找到解决我的问题的方法(是的,我知道这不是应该有效的代码,但我想它的目的很明确)用于创建新列g:


 library(dplyr)

 df <- mutate(df,

         if (a == 2 | a == 5 | a == 7 | (a == 1 & b == 4)){g = 2},

         if (a == 0 | a == 1 | a == 4 | a == 3 |  c == 4) {g = 3})

我正在寻找的代码的结果应该在这个特定的例子中有这个结果:


  a b c d e f  g

1 1 1 6 6 1 2  3

2 3 3 3 2 2 3  3

3 4 4 6 4 4 4  3

4 6 2 5 5 5 2 NA

5 3 6 3 3 6 2 NA

6 2 7 6 7 7 7  2

7 5 2 5 2 6 5  2

8 1 6 3 6 3 2  3

有没有人知道如何在dplyr中这样做?这个数据框只是一个例子,我正在处理的数据框要大得多。由于它的速度,我试图使用dplyr,但也许还有其他更好的方法来处理这个问题?


蝴蝶刀刀
浏览 619回答 3
3回答

侃侃无极

使用&nbsp;ifelsedf&nbsp;%>% &nbsp;&nbsp;mutate(g&nbsp;=&nbsp;ifelse(a&nbsp;==&nbsp;2&nbsp;|&nbsp;a&nbsp;==&nbsp;5&nbsp;|&nbsp;a&nbsp;==&nbsp;7&nbsp;|&nbsp;(a&nbsp;==&nbsp;1&nbsp;&&nbsp;b&nbsp;==&nbsp;4),&nbsp;2, &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ifelse(a&nbsp;==&nbsp;0&nbsp;|&nbsp;a&nbsp;==&nbsp;1&nbsp;|&nbsp;a&nbsp;==&nbsp;4&nbsp;|&nbsp;a&nbsp;==&nbsp;3&nbsp;|&nbsp;&nbsp;c&nbsp;==&nbsp;4,&nbsp;3,&nbsp;NA)))添加 - if_else:注意,在dplyr 0.5中有一个if_else定义的函数,所以替代方法是替换ifelse为if_else;&nbsp;但请注意,因为if_else比ifelse条件更严格(条件的两条腿必须具有相同的类型)所以NA在这种情况下必须更换NA_real_。df&nbsp;%>% &nbsp;&nbsp;mutate(g&nbsp;=&nbsp;if_else(a&nbsp;==&nbsp;2&nbsp;|&nbsp;a&nbsp;==&nbsp;5&nbsp;|&nbsp;a&nbsp;==&nbsp;7&nbsp;|&nbsp;(a&nbsp;==&nbsp;1&nbsp;&&nbsp;b&nbsp;==&nbsp;4),&nbsp;2, &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if_else(a&nbsp;==&nbsp;0&nbsp;|&nbsp;a&nbsp;==&nbsp;1&nbsp;|&nbsp;a&nbsp;==&nbsp;4&nbsp;|&nbsp;a&nbsp;==&nbsp;3&nbsp;|&nbsp;&nbsp;c&nbsp;==&nbsp;4,&nbsp;3,&nbsp;NA_real_)))添加 - case_when自发布此问题后,dplyr已添加,case_when因此另一个替代方案是:df&nbsp;%>%&nbsp;mutate(g&nbsp;=&nbsp;case_when(a&nbsp;==&nbsp;2&nbsp;|&nbsp;a&nbsp;==&nbsp;5&nbsp;|&nbsp;a&nbsp;==&nbsp;7&nbsp;|&nbsp;(a&nbsp;==&nbsp;1&nbsp;&&nbsp;b&nbsp;==&nbsp;4)&nbsp;~&nbsp;2, &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a&nbsp;==&nbsp;0&nbsp;|&nbsp;a&nbsp;==&nbsp;1&nbsp;|&nbsp;a&nbsp;==&nbsp;4&nbsp;|&nbsp;a&nbsp;==&nbsp;3&nbsp;|&nbsp;&nbsp;c&nbsp;==&nbsp;4&nbsp;~&nbsp;3, &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TRUE&nbsp;~&nbsp;NA_real_))
打开App,查看更多内容
随时随地看视频慕课网APP