我有一個titanic以 2021 排乘客命名的資料框,其中包含每位乘客的巨大和具體特征:
Class Sex Age Survived
1 3rd Male Child No
2 3rd Male Child No
3 3rd Male Child No
4 3rd Male Child No
5 3rd Male Child No
6 3rd Male Child No
...
我想創建一個具有多個引數的函式,如下所示:
f1 <- function(sex, age, class, survived){
...
}
引數是我輸入乘客的一些標準的地方。例如,我希望能夠將標準輸入到函式中,以便
f1("Female", "Child","3rd", "Yes")
回傳
Class Sex Age Survived
1534 3rd Female Child Yes
1535 3rd Female Child Yes
1536 3rd Female Child Yes
1537 3rd Female Child Yes
1538 3rd Female Child Yes
現在,我已經對其進行了硬編碼,并且只使用了 if else 陳述句來涵蓋所有可能性。
function.q6.1 <- function(sex,age,class,survival){
if(sex == "Male" & age == "Child" & class == "3rd" & survival == "No"){
subset(titanic, Sex == "Male" & Age == "Child" & Class == "3rd" & Survived == "No")
}
else if(sex == "Female" & age == "Child" & class == "3rd" & survival == "No"){
subset(titanic, Sex == "Female" & Age == "Child" & Class == "3rd" & Survived == "No")
}
else if(sex == "Male" & age == "Adult" & class == "3rd" & survival == "No"){
subset(titanic, Sex == "Male" & Age == "Adult" & Class == "3rd" & Survived == "No")
}
...
}
我想知道是否有更有效的方法來做到這一點。提前謝謝你。
uj5u.com熱心網友回復:
這假設第一個引數是資料框,其余引數是每個列的值,按照它們出現在資料框中的順序或命名。
引數可能比列少,在這種情況下,對于未命名的引數,資料框的第一列將與相同數量的引數匹配。如果引數被命名,那么匹配將使用這些名稱。資料框之后的所有引數必須命名或不命名。如果僅傳遞資料幀而沒有其他引數,則不可見地回傳 NULL。
如果在資料框之后有非零數量的引數,我們將獲取名稱或使用前 n 個名稱,其中 n 是資料框之后的引數數量。然后從 dat 中洗掉帶有 NA 的行,假設這些行不能匹配。mapply 將連續列與回傳邏輯矩陣的連續引數值進行比較。apply 每行回傳一個邏輯值,然后我們用它下標。
我們在測驗呼叫末尾的注釋中使用可重復顯示的資料框。
f1 <- function(dat, ...) {
if (n <- ...length()) {
if (is.null(nms <- ...names())) nms <- head(names(dat), n)
dat <- na.omit(dat)
dat[apply(mapply(`==`, dat[nms], list(...)), 1, all), ]
}
}
現在我們運行一些測驗
f1(dat, "3rd", "Male", "Child", "No")
## Class Sex Age Survived
## 1 3rd Male Child No
## 2 3rd Male Child No
## 3 3rd Male Child No
## 4 3rd Male Child No
## 5 3rd Male Child No
## 6 3rd Male Child No
f1(dat, "3rd", "Female", "Child", "No")
## [1] Class Sex Age Survived
## <0 rows> (or 0-length row.names)
f1(dat, "3rd")
## Class Sex Age Survived
## 1 3rd Male Child No
## 2 3rd Male Child No
## 3 3rd Male Child No
## 4 3rd Male Child No
## 5 3rd Male Child No
## 6 3rd Male Child No
f1(BOD, 1, 8.3) # BOD is built into R
## Time demand
## 1 1 8.3
f1(BOD, demand = 8.3)
## Time demand
## 1 1 8.3
筆記
Lines <- "
Class Sex Age Survived
1 3rd Male Child No
2 3rd Male Child No
3 3rd Male Child No
4 3rd Male Child No
5 3rd Male Child No
6 3rd Male Child No"
dat <- read.table(text = Lines)
更新
允許的引數少于列,并允許命名引數。
uj5u.com熱心網友回復:
如果您使用的是問題中所示的 data.frame,則可以使用
library(dplyr)
my_filter <- function(sex, age, class, survived) {
df %>%
filter(Sex == sex, Age == age, Class == class, Survived == survived)
}
現在my_filter("Female", "Child","3rd", "Yes")回傳
Class Sex Age Survived
7 3rd Female Child Yes
8 3rd Female Child Yes
9 3rd Female Child Yes
10 3rd Female Child Yes
11 3rd Female Child Yes
uj5u.com熱心網友回復:
#toy dataset
set.seed(1912)
titanic <- data.frame(class = sample(c("1st","2nd","3rd"),100,replace = T),
sex = sample(c("Male","Female"),100,replace = T),
age = sample(c("Child","Adult"),100,replace = T),
survival = sample(c("Yes","No"),100,replace = T)
)
f1 <- function(sex,age,class,survival) {
titanic[titanic$class==class&titanic$sex==sex&titanic$age==age&titanic$survival==survival,]
}
f1("Female", "Child","3rd", "Yes")
class sex age survival
11 3rd Female Child Yes
15 3rd Female Child Yes
38 3rd Female Child Yes
71 3rd Female Child Yes
85 3rd Female Child Yes
94 3rd Female Child Yes
uj5u.com熱心網友回復:
更新:
將您的列和條件分別存盤在一個向量中,然后將該函式應用于資料框:
library(dplyr)
library(stringr)
f1 <- paste(f1, collapse = "|")
cols <- c("Sex", "Age", "Class", "Survived")
my_function <- function(df){
df %>%
select(cols) %>%
filter(if_all(everything(), ~str_detect(.,f1))
)
}
my_function(df)
第一個答案:
也許另一種策略可能是:
library(dplyr)
library(stringr)
f1 <- paste(f1, collapse = "|")
my_function <- function(df){
df %>%
select(Sex, Age, Class, Survived) %>%
filter(if_all(everything(), ~str_detect(.,f1))
)
}
my_function(df)
輸出:
Sex Age Class Survived
1534 Female Child 3rd Yes
1535 Female Child 3rd Yes
1536 Female Child 3rd Yes
1537 Female Child 3rd Yes
1538 Female Child 3rd Yes
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/460395.html
上一篇:如何完成這個實作匿名公歷計算演算法來計算復活節日期的python程式?
下一篇:如果f1匹配,如何列印else
