我有一個資料框(示例資料):
id <- c(1, 2, 3)
ex1 <- c(0.8, 0.2, 0.3)
ex2 <- c(0.1, 0.4, 0.04)
ex3 <- c(0.04, 0.3, 0.5)
ex <- c(1, 1, 1)
ran <- c(0.5, 0.7, 0.6)
dat <- data.frame(id, ex1, ex2, ex3, ex, ran)
dat
id ex1 ex2 ex3 ex ran
1 1 0.8 0.10 0.04 1 0.5
2 2 0.2 0.40 0.30 1 0.7
3 3 0.3 0.04 0.50 1 0.6
我想用 if-else 條件更改“ex”的值。當“ran”小于或等于 ex$ 變數的最大值時,“ex”應更改為 5(任意)。它也應該大于其他 ex$-變數,但它們應該被排序——第二大的值加到最小值上。以下是所有 id 的示例,從 id 1 開始:
dat$ex <- ifelse(dat$ran <= dat$ex1 & dat$ran > dat$ex1 dat$ex2, 5, dat$ex)
這里,ex1 是最大值,其次是 ex1 和 ex2。
對于 id 2,它應該是:
dat$ex <- ifelse(dat$ran <= dat$ex2 & dat$ran > dat$ex3 dat$ex1, 5, dat$ex)
這里,ex2 是最大值,其次是ex3,然后是ex1。
對于 ID 3:
dat$ex <- ifelse(dat$ran <= dat$ex3 & dat$ran > dat$ex1 dat$ex2, 5, dat$ex)
這里,ex3 是最大值,其次是ex1,然后是ex2。
現在問題來了:如何概括 ifelse 陳述句?注意:按照示例中的實施方式執行兩個較小值的求和是很重要的。我需要通過 id 在 ifelse 中識別 ex1、ex2 和 ex3 的排序值。
uj5u.com熱心網友回復:
這是我們如何使用dplyrand完成任務的方法tidyr:
library(dplyr)
library(tidyr)
dat %>%
pivot_longer(
cols = ex1:ex3
) %>%
arrange(id, desc(value)) %>%
group_by(id) %>%
mutate(ex = ifelse(ran <= value[1] & ran > sum(value[2], value[3]), 5, ex)) %>%
pivot_wider(
names_from=name
)
輸出:
id ex ran ex1 ex2 ex3
<dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 1 5 0.5 0.8 0.1 0.04
2 2 1 0.7 0.2 0.4 0.3
3 3 1 0.6 0.3 0.04 0.5
uj5u.com熱心網友回復:
我們可能會使用 pmax
library(dplyr)
library(purrr)
dat %>%
mutate(ex= case_when(ran <=invoke(pmax, across(matches('^ex\\d '))) ~ 5,
TRUE ~ ex))
id ex1 ex2 ex3 ex ran
1 1 0.8 0.10 0.04 5 0.5
2 2 0.2 0.40 0.30 1 0.7
3 3 0.3 0.04 0.50 1 0.6
uj5u.com熱心網友回復:
exes <- t(apply(subset(dat, select = grep("^ex. ", names(dat))), 1, function(z) c(max(z), sum(z[-which.max(z)]))))
exes
# [,1] [,2]
# 1 0.8 0.14
# 2 0.4 0.50
# 3 0.5 0.34
ifelse(dat$ran <= exes[,1] & dat$ran > exes[,2], 5, dat$ran)
# 1 2 3
# 5.0 0.7 0.6
演練:
subset(dat, ...)是一種從框架中動態提取列的方法,而不管其型別(例如,data.frame,tbl_df, 或data.table),并且沒有將框架丟棄到列的風險(即,看到它mtcars[,2]不再是框架);還有其他方法可以做到這一點,一些在基礎 R 中,一些在其他包中,例如dplyr或data.tableapply(dat, 1, ..)對各列的行進行操作;因為當MARGIN=1(第二個引數)時,它會轉置結果,所以我們需要將t(.)它恢復到正確的形狀;exes現在是一個矩陣,其第一列包含ex#變數的最大值,第二列包含非最大值ex#變數的總和
從這里開始,我認為使用的exes是您正在尋找的“通用”解決方案。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/335805.html
上一篇:使用ggplot繪制邏輯回歸線:警告訊息:“stat_smooth()”中的計算失敗:未使用的引數(資料=資料)
