首页 文章

在dplyr :: mutate中使用条件

提问于
浏览
2

我正在使用大型数据框 . 我正在尝试根据两个当前向量中存在的条件创建一个新向量 .

鉴于数据集的大小(及其一般的真棒)我试图找到使用dplyr的解决方案,这导致我变异 . 我觉得我并不遥远,但我只是无法找到坚持不懈的解决方案 .

我的数据框类似于:

ID  X  Y
1   1 10 12
2   2 10 NA
3   3 11 NA
4   4 10 12
5   5 11 NA
6   6 NA NA
7   7 NA NA
8   8 11 NA
9   9 10 12
10 10 11 NA

要重新创建它:

ID <- c(1:10)
X <- c(10, 10, 11, 10, 11, NA, NA, 11, 10, 11)
Y <- c(12, NA, NA, 12, NA, NA, NA, NA, 12, NA)

我想从现有数据创建一个新的向量'Z' . 如果Y> X,那么我希望它从Y返回值 . 如果Y是NA,那么我希望它返回X值 . 如果两者都是NA,那么它应该返回NA .

到目前为止,我尝试使用下面的代码让我创建一个满足第一个条件但不是第二个条件的新向量 .

newData <- data %>% 
        mutate(Z =
               ifelse(Y > X, Y,
               ifelse(is.na(Y), X, NA)))

> newData
   ID  X  Y  Z
1   1 10 12 12
2   2 10 NA NA
3   3 11 NA NA
4   4 10 12 12
5   5 11 NA NA
6   6 NA NA NA
7   7 NA NA NA
8   8 11 NA NA
9   9 10 12 12
10 10 11 NA NA

我觉得我错过了一些简单的事情 . 可以指出我正确的方向吗?

2 回答

  • 8

    pmax(, na.rm=TRUE) 正是您要找的

    data <- data_frame(ID = c(1:10),
               X = c(10, 10, 11, 10, 11, NA, NA, 11, 10, 11),
               Y = c(12, NA, NA, 12, NA, NA, NA, NA, 12, NA))  
    data %>% mutate(Z = pmax(X, Y, na.rm=TRUE))
    #   ID  X  Y  Z
    #1   1 10 12 12
    #2   2 10 NA 10
    #3   3 11 NA 11
    #4   4 10 12 12
    #5   5 11 NA 11
    #6   6 NA NA NA
    #7   7 NA NA NA
    #8   8 11 NA 11
    #9   9 10 12 12
    #10 10 11 NA 11
    
  • 2

    ifelse 代码可以

    data %>%
           mutate(Z= ifelse(Y>X & !is.na(Y), Y, X))
    #   ID  X  Y  Z
    #1   1 10 12 12
    #2   2 10 NA 10
    #3   3 11 NA 11
    #4   4 10 12 12
    #5   5 11 NA 11
    #6   6 NA NA NA
    #7   7 NA NA NA
    #8   8 11 NA 11
    #9   9 10 12 12
    #10 10 11 NA 11
    

相关问题