我正在嘗試創建一個新變數,該變數僅在滿足特定條件時才列印一系列列的第一個值。
為了澄清,我的資料庫看起來像這樣:
| 變數1 | 變數2 | 變數3 | var4 |
|---|---|---|---|
| C7931 | C3490 | R0781 | I10 |
| R079 | R0600 | I10 | C3490 |
| S270XXA | S225XXA | C3490 | C7931 |
我想創建一個變數(main),僅當值不以 C00 到 C99 開頭時才列印第一個 var 列中的值。如果該值確實以該條件開頭,那么我想在下一列測驗該條件,直到滿足該條件并列印該值。
因此,對于上表,新創建的變數 (main) 應該如下所示:
| 變數1 | 變數2 | 變數3 | var4 | 主要的 |
|---|---|---|---|---|
| C7931 | C3490 | R0781 | I10 | R0781 |
| R079 | R0600 | I10 | C3490 | R079 |
| C0258 | S225XXA | C3490 | C7931 | S225XXA |
我不太確定從哪里開始,但我懷疑這可能涉及 mutate() 和 ifelse()
uj5u.com熱心網友回復:
我們可以grepl通過遍歷每一行來創建一個用于子集的邏輯向量。匹配的模式C后跟一個或多個數字 ( \\d ) 和否定 ( !) 邏輯向量以子集元素,并回傳第一個 ( [1])
df1$main <- apply(df1[startsWith(names(df1), "var")], 1,
function(x) x[!grepl("^C\\d ", x)][1])
與tidyverse, 可以rowwise與str_subset
library(dplyr)
library(stringr)
df1 %>%
rowwise %>%
mutate(main = first(str_subset(c_across(starts_with("var")),
regex("^C\\d "), negate = TRUE))) %>%
ungroup
# A tibble: 3 × 5
var1 var2 var3 var4 main
<chr> <chr> <chr> <chr> <chr>
1 C7931 C3490 R0781 I10 R0781
2 R079 R0600 I10 C3490 R079
3 S270XXA S225XXA C3490 C7931 S270XXA
資料
df1 <- structure(list(var1 = c("C7931", "R079", "S270XXA"), var2 = c("C3490",
"R0600", "S225XXA"), var3 = c("R0781", "I10", "C3490"), var4 = c("I10",
"C3490", "C7931")), class = "data.frame", row.names = c(NA, -3L
))
uj5u.com熱心網友回復:
這將創建一個列,其中存盤了所有不滿足條件的值:來自 akrun 的資料:
library(tidyverse)
df1 %>%
mutate(across(var1:var4, ~case_when(str_detect(., "^C\\d ") ~ "",
TRUE ~ .), .names = 'new_{col}')) %>%
unite(New_Col, starts_with('new'), na.rm = TRUE, sep = ' ')
var1 var2 var3 var4 New_Col
1 C7931 C3490 R0781 I10 R0781 I10
2 R079 R0600 I10 C3490 R079 R0600 I10
3 S270XXA S225XXA C3490 C7931 S270XXA S225XXA
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/450206.html
上一篇:通過R中最接近的值合并兩個資料幀
