使用 dplyr::mutate 中的条件
Using conditions in dplyr::mutate
我正在处理大型数据框。我正在尝试根据两个当前向量中存在的条件创建一个新向量。
考虑到数据集的大小(及其一般的令人敬畏),我正在尝试使用 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,那么我想要它 return 来自 Y 的值。如果 Y 是 NA 那么我想要它 return X 值。如果两者都是 NA,那么它应该 return 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
我觉得我错过了一些非常简单的东西。能给我指出正确的方向吗?
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
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
我正在处理大型数据框。我正在尝试根据两个当前向量中存在的条件创建一个新向量。
考虑到数据集的大小(及其一般的令人敬畏),我正在尝试使用 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,那么我想要它 return 来自 Y 的值。如果 Y 是 NA 那么我想要它 return X 值。如果两者都是 NA,那么它应该 return 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
我觉得我错过了一些非常简单的东西。能给我指出正确的方向吗?
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
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