[英]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.