簡體   English   中英

使用 purrr 根據現有變量的值創建多個新變量

[英]Using purrr to create several new variables based on values of existing variables

編輯:添加示例 df

我有一個 3 項清單(選項 a、b、c),參與者可以在其中選擇適用於他們的盡可能多的答案。 在我的數據中,這些響應存儲在三個二元響應選項中(q4___a、q4___b、q4___c)。 我在四個不同的時間點(1、2、3、4)有相同的數據,所以我的變量編碼如下:

q4_1___a
q4_1___b
q4_1___c
q4_2___a
q4_2___b

等等,其中 q4 是詞干,整數是收集數據的時間,字母是響應選項。 這是一個示例數據框:

df <- data.frame(
 q4_1___a = rbinom(10, 1, .5),
 q4_1___b = rbinom(10, 1, .5),
 q4_1___c = rbinom(10, 1, .5),
 q4_2___a = rbinom(10, 1, .5),
 q4_2___b = rbinom(10, 1, .5),
 q4_2___c = rbinom(10, 1, .5),
 q4_3___a = rbinom(10, 1, .5),
 q4_3___b = rbinom(10, 1, .5),
 q4_3___c = rbinom(10, 1, .5),
 q4_4___a = rbinom(10, 1, .5),
 q4_4___b = rbinom(10, 1, .5),
 q4_4___c = rbinom(10, 1, .5)
)

我需要創建“組”變量,在每個時間點組合三個不同的二元響應變量的結果。 我可以使用以下代碼在時間點 1 執行此操作:

df%>%
 mutate(q4_1_group = case_when(
  q4_1___a == 1 & q4_1___b == 0 & q4_1___c == 0 ~ "a",
  q4_1___a == 0 & q4_1___b == 1 & q4_1___c == 0 ~ "b",
  q4_1___a == 0 & q4_1___b == 0 & q4_1___c == 1 ~ "c",
  q4_1___a == 1 & q4_1___b == 1 & q4_1___c == 0 ~ "ab",
  q4_1___a == 1 & q4_1___b == 0 & q4_1___c == 1 ~ "ac",
  q4_1___a == 0 & q4_1___b == 1 & q4_1___c == 1 ~ "bc",
  q4_1___a == 1 & q4_1___b == 1 & q4_1___c == 1 ~ "abc"
 ))

我無法弄清楚從這里到哪里去遍歷所有四個時間點。 本質上,我需要將所有變量名稱中的 1 更改為 2、3 和 4,以便:

df%>%
 mutate(q4_[i]_group = case_when(
  q4_[i]___a == 1 & q4_[i]___b == 0 & q4_[i]___c == 0 ~ "a",
  q4_[i]___a == 0 & q4_[i]___b == 1 & q4_[i]___c == 0 ~ "b",
  q4_[i]___a == 0 & q4_[i]___b == 0 & q4_[i]___c == 1 ~ "c",
  q4_[i]___a == 1 & q4_[i]___b == 1 & q4_[i]___c == 0 ~ "ab",
  q4_[i]___a == 1 & q4_[i]___b == 0 & q4_[i]___c == 1 ~ "ac",
  q4_[i]___a == 0 & q4_[i]___b == 1 & q4_[i]___c == 1 ~ "bc",
  q4_[i]___a == 1 & q4_[i]___b == 1 & q4_[i]___c == 1 ~ "abc"
 ))

其中[i]對應於類似c(1:4) 我覺得必須有一種直接的方法來使用purrr來做到這purrr ,但我正在努力弄清楚。 任何幫助將不勝感激!

我們可以創建一個keyval數據集,然后進行join

library(tidyverse)
keydat <- data.frame(a = c(1, 0, 0, 1, 1, 0, 1),
                     b = c(0, 1, 0, 1, 0, 1, 1), 
                     c = c(0, 0, 1, 0, 1, 1, 1),
                     group = c("a", "b", "c", "ab", "ac", "bc", "abc"), 
            stringsAsFactors = FALSE)
nm1 <- unique(sub("__.*", "", names(df)))
split.default(df, as.numeric(gsub("^q\\d+_|__.*$", "", names(df)))) %>%
     map(~ .x %>%
              left_join(keydat, by = setNames(letters[1:3], names(.x)))) %>%
     bind_cols %>%
     rename_at(vars(matches('group')), ~paste0(nm1, '_group'))

暫無
暫無

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

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