我想創建一個變數x,它是變數e和變數之一的乘積a, b, c,或者d。結果變數應該取值a * e,但如果a是NA,那么它應該取值b * e,如果a & b缺失,那么它應該取值c * e,依此類推。
例如:如果我的資料框如下所示:
df <- data.frame(a = c(1, 2, NA, NA, 5), b = c(NA, 1, NA, 4, 6), c = c(NA, 3, 3, 3, 7), d = c(1, 1, 1, 1, 1), e = c(1, 2, 3, 4, NA))
我想得到以下結果:
df$x <- c(1, 4, 9, 16, NA)
我試圖通過以下方式實作:
df <- df %>% mutate(x = case_when(!is.na(a) ~ a * e, is.na(a) ~ b * e, is.na(a) & is.na(b) ~ c * e, is.na(a) & is.na(b) & is.na(c) ~ d * e))
不幸的是,這還沒有奏效,因為 R 不知何故無法理解is.na(a) & is.na(b),因為兩個值同時缺失。
uj5u.com熱心網友回復:
您可以使用coalesce()fromdplyr來查找第一個非缺失元素。
library(dplyr)
df %>%
mutate(x = e * coalesce(a, b, c, d))
# a b c d e x
# 1 1 NA NA 1 1 1
# 2 2 1 3 1 2 4
# 3 NA NA 3 1 3 9
# 4 NA 4 3 1 4 16
# 5 5 6 7 1 NA NA
如果你有很多列要相乘,你可以使用 tidy-selection 來自動化它across()。(編輯:感謝@akrun的改進)
df %>%
mutate(x = e * do.call(coalesce, across(a:d)))
uj5u.com熱心網友回復:
df <-
data.frame(
a = c(1, 2, NA, NA, 5),
b = c(NA, 1, NA, 4, 6),
c = c(NA, 3, 3, 3, 7),
d = c(1, 1, 1, 1, 1),
e = c(1, 2, 3, 4, NA)
)
df$res <- df[, 5] * apply(df[-5], 1, function(x) x[which(x = !is.na(x))[1]])
df
#> a b c d e res
#> 1 1 NA NA 1 1 1
#> 2 2 1 3 1 2 4
#> 3 NA NA 3 1 3 9
#> 4 NA 4 3 1 4 16
#> 5 5 6 7 1 NA NA
由reprex 包(v2.0.1)于 2022-05-19 創建
uj5u.com熱心網友回復:
這是一個帶有row/column索引的選項
df$res <- df$e * df[-5][cbind(seq_len(nrow(df)),
max.col(!is.na(df[-5]), 'first'))]
df$res
[1] 1 4 9 16 NA
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/478504.html
下一篇:熊貓:三個列出的列寬格式
