在R中创建新变量,该变量由是否缺少其他变量确定

时间:2015-03-05 01:45:51

标签: r

我运行具有同一问题的多个版本的实验,具体取决于参与者分配的条件。所以,假设我有两个条件:A和B.在我的数据文件中,每个问题的响应值显示在不同的列中

screenshot

我想完成两件事:

  1. 创建一个名为“Condition”的变量,如果例如Q1ifCondA的值不为空,则赋值“A”,如果Q1ifCondB不为空,则类似地赋值“B”。

  2. 为每个问题创建单个变量,Q1,Q2和Q3,如果条件== A,则将Q1ifCondA的值分配给Q1,如果条件== B,则从Q1ifCondB分配给Q1。

  3. 任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:0)

我们可以使用lapply在循环(grep)中对相似的问题列进行分组,以查找各个问题列名称的位置('Q1','Q2','Q3')和子集数据集(df1[grep(x, names(df1))])。从示例数据来看,不清楚是否会出现两列“非空白”或两者都是“空白”的情况,也没有提及如何处理此类情况。假设它没有发生,我们可以使用max.col来获得列位置(将给出1或2)。将该索引替换为“A”或“B”(LETTERS[1:2][max.col...]

 df1[paste0('ConditionQ', 1:3)] <- lapply(paste0('Q',1:3), function(x)
              {x1 <- df1[grep(x, names(df1))]
              LETTERS[1:2][max.col(x1!='')]})

 df1
 #   Partic Q1ifCondA Q2ifCndA Q3ifCondA Q1ifCondB Q2ifCondB Q3ifcondB ConditionQ1
 #1      1         3        6         8                                         A
 #2      2         1        5         4                                         A
 #3      3                                      7         4         2           B
 #4      4         1        9         6                                         A
 #5      5                                      5         9         4           B
 #6      6                                      4         8         5           B
 #7      7         6        3         3                                         A
 #8      8                                      7         4         7           B
 #    ConditionQ2 ConditionQ3
 #1           A           A
 #2           A           A
 #3           B           B
 #4           A           A
 #5           B           B
 #6           B           B
 #7           A           A
 #8           B           B

数据

df1 <- structure(list(Partic = 1:8, Q1ifCondA = c("3", "1", "", "1", 
"", "", "6", ""), Q2ifCndA = c("6", "5", "", "9", "", "", "3", 
""), Q3ifCondA = c("8", "4", "", "6", "", "", "3", ""), Q1ifCondB = c("", 
"", "7", "", "5", "4", "", "7"), Q2ifCondB = c("", "", "4", "", 
"9", "8", "", "4"), Q3ifcondB = c("", "", "2", "", "4", "5", 
"", "7")), .Names = c("Partic", "Q1ifCondA", "Q2ifCndA", "Q3ifCondA", 
"Q1ifCondB", "Q2ifCondB", "Q3ifcondB"), row.names = c(NA, -8L
), class = "data.frame")