簡體   English   中英

dplyr 基於其他后綴不同的列進行變異

[英]dplyr mutate based on other column with different suffix

我有一個類似於這個的 dataframe:

df <- data.frame(a_1_1 = c(1, 0, 1), a_1_2=c(1,0,0),a_2_1=c(1,0,0), a_2_2=c(1,0 ,1), b=c(2,3,4))

我想通過比較具有相同前綴的列來創建新變量,方法如下:

df <- df %>% mutate(a_1=case_when((a_1_1==1 | a_1_2==1)~"A", TRUE ~ "B")) %>% 
mutate(a_2=case_when((a_2_1==1 | a_2_2==1)~"A", TRUE ~ "B"))

但是在我的真實數據中,我有很多以“a_*”開頭的變量,所以我想創建這些變量,而不是一次為每個變量做一次。

across循環遍歷以 'a' 開頭的列,后跟_和一些數字,然后是_和字符串末尾的數字 1 ( $ ),使用case_when在該列 ( . ) 和通過使用str_replace更改列名稱 ( cur_column() ) 由相應列返回的值 ( get ),將新列的后綴指定為_new ,然后在下一步中使用rename_with重命名這些列

library(dplyr)
library(stringr)
df %>% 
  mutate(across(matches('^a_\\d+_1$'), 
   ~ case_when(. == 1| get(str_replace(cur_column(), '_\\d+$', '_2')) == 1 ~ 'A',
      TRUE ~ 'B'), .names = '{.col}_new')) %>%
  rename_with(~ str_remove(., '_\\d+_new'), ends_with('new'))

-輸出

#  a_1_1 a_1_2 a_2_1 a_2_2 b a_1 a_2
#1     1     1     1     1 2   A   A
#2     0     0     0     0 3   B   B
#3     1     0     0     1 4   A   A

或者另一種選擇是使用pivot_longer重塑為“長”格式,並使其更容易進行比較以創建新列,使用pivot_wider將其重塑為寬格式,然后將這些新列綁定到原始數據

library(tidyr)
df %>%
  select(-b) %>% 
  mutate(rn = row_number()) %>%
  pivot_longer(cols = -rn, names_to = c('grp', '.value'),
      names_sep = "_(?=\\d+$)") %>% 
  transmute(rn, grp, val = case_when(`1` == 1|`2` == 1 ~ 'A',
       TRUE ~ 'B')) %>% 
  pivot_wider(names_from = grp, values_from = val) %>% 
  select(-rn) %>% 
  bind_cols(df, .)

或者使用帶有 split.default 的base R split.default

df[paste0("a_", 1:2)] <- ifelse(
     sapply(split.default(df[startsWith(names(df), "a_")],  
     sub("_\\d+$", "", grep("^a_", names(df), value = TRUE))),
      rowSums) > 0, 'A', 'B')

或使用for循環

nm1 <- unique(sub("_\\d+$", "", grep('^a_\\d+', names(df), value = TRUE)))
for(nm in nm1) df[[nm]] <- ifelse(rowSums(df[startsWith(names(df), 
      nm)]) > 0, "A", "B")

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM