当前位置: 首页 > 知识库问答 >
问题:

使用purrr::map2在列名的两个向量上循环,以便有条件地将多列重新编码为新变量

申屠宏胜
2023-03-14
library(tidyverse)    

使用下面的示例代码,我想使用“mutate”或“mutate_at”将多个列重新编码为基于另一列的值的新列。基本上,我想基于相应的非“S”变量的值,重新编码以“S”结尾的变量(q25s,q26s等..)。例如,如果q25=1,那么q25s将被重新编码,使得1=0,2=0,3=0,4=1,5=1和88=缺失,并且新名称将是q25_new。如果q25不等于1,则不应重新编码is,而q25_new应仅为NA。

cols1<-Df %>%select(q25:q29)
cols2<-Df %>% select(q25s:q29s)

Df<- Df %>% map2(Df[cols1],Df[cols2],
  ~if_else(.x==1, mutate_at(vars (.y),funs(recode(.,`1`=0,`2`=0,`3`=0,`4`=1,`5`=1),"NA"))))

下面是示例代码。

Here is the sample code:
q25<-c(2,1,88,2,1)
q26<-c(2,88,88,88,2)
q27<-c(2,2,1,1,1)
q28<-c(88,1,1,2,2)
q29<-c(1,1,1,2,2)
q25s<-c(3,5,88,4,1)
q26s<-c(4,4,5,5,1)
q27s<-c(3,3,4,1,4)
q28s<-c(4,5,88,1,3)
q29s<-c(88,88,3,4,4)
Df<-data.frame(q25,q26,q27,q28,q29,q25s,q26s,q27s,q28s,q29s)

共有1个答案

须曜文
2023-03-14

这样行吗?

map2(Df[1:5],Df[6:10], ~ if_else(.x==1, recode(.y,`1`=0,`2`=0,`3`=0,`4`=1,`5`=1,`88` = NA_real_),NA_real_)) %>%
  as.data.frame %>%
  rename_all(paste0,"_new") %>%
  cbind(Df,.)

#   q25 q26 q27 q28 q29 q25s q26s q27s q28s q29s q25_new q26_new q27_new q28_new q29_new
# 1   2   2   2  88   1    3    4    3    4   88       3       4       3       4      NA
# 2   1  88   2   1   1    5    4    3    5   88       1       4       3       1      NA
# 3  88  88   1   1   1   88    5    4   88    3      88       5       1      NA       0
# 4   2  88   1   2   2    4    5    1    1    4       4       5       0       1       4
# 5   1   2   1   2   2    1    1    4    3    4       0       1       1       3       4

好吧,最后我无法抗拒挑战,所以这里有一个几乎100%整洁的方法去做它(相同的输出):

library(tidyr)
Df %>%
  mutate(n=row_number()) %>%
  gather(key,value,-n) %>%
  mutate(key2 = ifelse(grepl("s",key),"s","x"),
         key=sub("s","",key)) %>%
  spread(key2,value) %>%
  mutate(`_new` = if_else(x==1, recode(s,`1`=0,`2`=0,`3`=0,`4`=1,`5`=1,`88` = NA_real_),Inf)) %>%
  gather(key3,value,s,x,`_new`) %>%
  unite(key,key,key3,sep="") %>%
  spread(key,value) %>%
  rename_all(~gsub("x","",.x)) %>%
  select(order(nchar(names(.))),-n)
 类似资料:
  • 问题内容: 如何使用列表中的名称创建新变量?这个: 当然不行。我该怎么办? 我想做这个: 问题答案: 我认为更适合此目的: 但是,如果您仍然想即时创建变量,则可以使用:

  • 下面是我的可复制代码: 另外,我知道.dots可以接收矢量中的名称(我想),但我不太理解如何在mutate()中与case_when一起使用。 也欢迎使用recoded值创建新列的其他方法 更新:我的预期输出将是包含26个新列的原始数据帧,p1_cod:p26_cod,可能包含值1(如果正确)和0(如果不正确)。 类似这样的内容(我刚刚创建了4个列,其中有1和0作为示例)。

  • 我用的是spark 2.1,脚本是pyspark。请帮我一下,因为我被困在这里了。 问题陈述:根据多列的条件创建新列 输入<code>数据帧<code>如下 现在我需要创建一个新列作为FLG,我的条件是如果

  • 我有一个国家和年份级别的面板数据集,我想根据现有的变量创建两个新变量。 我想做的是创建两个新变量集:(1)每年(跨国家)平均值的变量集和(2)国家/地区值相对于年平均值的变量集。例如,对于 var1(1) 将产生 mean_var1 和 (2) relmean_var1我希望这些变量用于所有其他变量。总的来说,数据集中有超过1000个变量,但我只将此函数应用于大约6个。 我有适用于第一部分的代码,

  • 我需要基于另一个表重新编码一个数据帧的多列上的值。 mutate创建一个新列调用!如何避免这一点?