使用R中的for循环确定从Qualtrics中的随机集中确定项目顺序



在我对我的Qualtrics调查中,每个参与者都收到了一组以随机顺序提出的问题。

我现在想确定一个问题(请参阅表中的"问题"变量(在参与者的随机问题顺序中。缩短示例中的问题是I1,I2或I3。

现在就组织了数据,使得有些列与顺序相对应(在下面的缩短示例中," b1"," b2"one_answers" b3"(。也就是说,B1列中的问题首先是该参与者的。

这是数据的文件(https://drive.google.com/open?id=1H18slq-gmruzh93m5y5y5t3tue22yxsjbu(,这就是它在r:

中打印出来的。
> head(testd)
  Question B1 B2 B3
1       I1 I1 I2 I3
2       I1 I3 I2 I1
3       I2 I2 I3 I1
4       I2 I3 I1 I2
5       I3 I2 I1 I3
6       I3 I1 I3 I2

我现在想在dataframe testd中写一个for循环,以使我是否会在列中告诉我"问题"中的问题(例如,i1(,首先提出了参与者的问题(i1((i1((b1(,第二(B2(或第三(B3(。例如,在上面的示例中,第1行的随机排列应为B1,因为列"问题"中的值是i1,而列中的值是i1。

为此,我首先将" b1"," b2"one_answers" b3"的值串联在一起。

testd <- read.csv("TestData.csv")
BSet <- c("B1", "B2", "B3")
testd[BSet]
然后,我写了以下循环。我的目标是:对于每行i,如果三个BSET列之一中的一个值与问题列中的值相同,则该行的可变随机订单应在其中一个中的值列。BSET列与问题列中的值相同。

例如,如果第1行中的testd $ b1 = i1,而第1行中的testd $ Question = i1,则该循环应使testd $随机订单等于B1。

for (i in nrow(testd)) {
  for (j in 1:3) {
    if (testd[i,BSet][[j]] == testd$Question[i]) {
      testd$RandomizedOrder[i] <- colnames(testd[i,BSet][j])
    }
  }
}

这就是R输出的样子。

> head(testd$RandomizedOrder)
[1] NA   NA   NA   NA   NA   "B2"

我不确定为什么除了第六个项目以外的所有内容。

这是我想要的循环要做的:制作一个名为"随机订单"的新变量,该变量指示每行,哪个列包含"问题"列中的值。

      Question B1 B2 B3 RandomizedOrder
    1       I1 I1 I2 I3 B1
    2       I1 I3 I2 I1 B3
    3       I2 I2 I3 I1 B2
    4       I2 I3 I1 I2 B3
    5       I3 I2 I1 I3 B3
    6       I3 I1 I3 I2 B2

我浏览了代码,以确保各个零件可以解决。

此处的代码是真实的(平等标志的双方都产生值I1(:

testd [1,bset] [[1]] == testd $问题[1] [1] true

我还可以手动告诉R用列名替换testd $ Randomibledorder中的值。

> testd$RandomizedOrder[1] <- colnames(testd[1,BSet][1])
> head(testd$RandomizedOrder)
[1] "B1" NA   NA   NA   NA   "B2"

有人可以帮我确定为什么for循环不起作用?

预先感谢您。

(请注意,这似乎可以用6个观测值手动手动完成,但这是我真实数据集的简单示例。我的实际数据集有48个问题(即i1至i48(,并且因此,我已经使用字母j。索引了BSET表示的列数。

在conframe列名称上考虑匹配的 lapply,然后使用Reduce,用于coc_2,用于cocesce方法,将所有列用于随机订单 sigsion。

txt = "Question B1 B2 B3
1       I1 I1 I2 I3
2       I1 I3 I2 I1
3       I2 I2 I3 I1
4       I2 I3 I1 I2
5       I3 I2 I1 I3
6       I3 I1 I3 I2"
testd <- read.table(text=txt, header=TRUE)
colList <-  lapply(names(testd)[-1], function(i)
  ifelse(testd$Question == testd[[i]], i, NA))
testd$RandomizedOrder <- Reduce(function(x, y) {
  x[which(is.na(x))] <- y[which(is.na(x))]
  x}, colList)
testd    
#   Question B1 B2 B3 RandomizedOrder
# 1       I1 I1 I2 I3              B1
# 2       I1 I3 I2 I1              B3
# 3       I2 I2 I3 I1              B1
# 4       I2 I3 I1 I2              B3
# 5       I3 I2 I1 I3              B3
# 6       I3 I1 I3 I2              B2

最新更新