我正在嘗試根據多列中的值生成一個新列(變數)。我在資料集中有 60 多列,我想對要回圈的列進行子集化。
我在所有字符的條件下使用的列變數,當匹配某個模式時,在新變數中回傳值 1。
我使用 when 是因為我需要在每一列上運行多個條件以回傳一個值。
代碼:
df read.csv("sample.csv")
*#Generate new variable name*
df$new_var <- 0
*#For loop through columns 16 to 45*
for (i in colnames(df[16:45])) {
df <- df %>%
mutate(new_var=
case_when(
grepl("I8501", df[[i]]) ~ 1
))
}
這不起作用,因為當我列出結果時,我只得到 1 個匹配的值。
我的另一個嘗試是使用:
for (i in colnames(df[16:45])) {
df <- df %>%
mutate(new_var=
case_when(
df[[i]] == "I8501" ~ 1
))
}
還有其他可能的方法來遍歷具有多個條件的多個列并相應地更改變數的值嗎?使用 R 來實作?
uj5u.com熱心網友回復:
如果我理解你想要什么,我認為你只需要在你case_when()的情況下指定另一種情況,以便在事情不匹配時保留現有值"I8501"。我會這樣做:
df$new_var <- 0
for (index in (16:45)) {
df <- df %>%
mutate(
new_var = case_when(
grepl("I8501", df[[index]]) ~ 1,
TRUE ~ df$new_var
)
)
}
我認為更好的方法是使用永遠有用的apply():
has_match = apply(df[, 16:45], 1, function(x) sum(grepl("I8501", x)) > 0)
df$new_var = ifelse(has_match, 1, 0)
uj5u.com熱心網友回復:
請檢查這是否適用于您的檔案。
樣本df:
df <- data.frame(C1=c('A','B','C','D'),C2=c(1,7,3,4),C3=c(5,6,7,8))
> df
C1 C2 C3
1 A 1 5
2 B 7 6
3 C 3 7
4 D 4 8
library(dplyr)
df %>%
rowwise() %>%
mutate(new_var = as.numeric(any(str_detect(c_across(2:last_col()), "7")))) # change the 2:last_col() to select your column range ex: 2:5
在任何列中查找“7”的輸出:
C1 C2 C3 new_var
<chr> <dbl> <dbl> <dbl>
1 A 1 5 0
2 B 7 6 1
3 C 3 7 1
4 D 4 8 0
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/432501.html
