如何从向量中提取特定值?

时间:2019-12-08 21:19:54

标签: r

有一个向量和一个数据帧。向量是原始数据,它记录了调查对象的回答(他们必须从三者中选择一个),因此它表示1-3。数据帧将组织来自第一个d.f的结果。我需要的是将每个试验的结果从向量中拖出,并在d.f中用新列“选择”进行指示。

我将在d中创建一个新的“选择”列。对于每个试验,从受访者中选择的备选方案在“选择”列中将为1,否则为0。我首先需要找到与d.f $ trial与向量中列名“ conjoint_full_info”之后的数字匹配的所选值。找到该值后,我需要在“选择”列中以“ 1”表示,并带有相应的替代行。 (通过查看向量,在试验1中,被访者选择了替代项1。因此,在选择的列中指示“ 1”以及列alternative = 1行。其余的2行则为“ 0”)我正在寻找一个应用于以下每个集合的方法,但我不确定如何以有效的方式对此进行编码。也许使用for循环?抱歉,解释不清楚,谢谢!!

这是两个数据集的方式

0

1 个答案:

答案 0 :(得分:1)

您的数据:

Vector <- c(conjoint_full_info.1. = 1, conjoint_full_info.2. = 2, conjoint_full_info.3. = 2, 
conjoint_full_info.4. = 2)

d.f <- structure(list(Ind = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L), .Label = "R_2Xb32PAT3WjGBnc", class = "factor"), 
    Trial = c(1L, 1L, 1L, 2L, 2L, 2L, 3L, 3L, 3L, 4L, 4L, 4L), 
    alternative = c(1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 
    3L), price = c(2L, 3L, 1L, 1L, 2L, 3L, 3L, 1L, 2L, 1L, 2L, 
    3L), privacy = c(3L, 1L, 2L, 2L, 3L, 1L, 1L, 2L, 3L, 1L, 
    2L, 3L), battery = c(1L, 2L, 3L, 2L, 3L, 1L, 3L, 1L, 2L, 
    1L, 2L, 3L), stars = c(1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 
    2L, 3L, 1L)), class = "data.frame", row.names = c("1", "2", 
"3", "4", "5", "6", "7", "8", "9", "10", "11", "12"))

我们创建一个映射向量:

mapVector = Vector
names(mapVector) = sapply(strsplit(names(Vector),"[.]"),"[[",2)

# now mapVector has names that match trial
mapVector
1 2 3 4 
1 2 2 2

如果我们执行mapVector[as.character(d.f$Trial)],我们将为每一行获得所选的替代项:

head(cbind(d.f,mapVector[as.character(d.f$Trial)]))
                Ind Trial alternative price privacy battery stars
1 R_2Xb32PAT3WjGBnc     1           1     2       3       1     1
2 R_2Xb32PAT3WjGBnc     1           2     3       1       2     2
3 R_2Xb32PAT3WjGBnc     1           3     1       2       3     3
4 R_2Xb32PAT3WjGBnc     2           1     1       2       2     1
5 R_2Xb32PAT3WjGBnc     2           2     2       3       3     2
6 R_2Xb32PAT3WjGBnc     2           3     3       1       1     3
  mapVector[as.character(d.f$Trial)]
1                                  1
2                                  1
3                                  1
4                                  2
5                                  2
6                                  2

因此,创建另一个列来检查是否与替代列一致是一个问题:

library(dplyr)

d.f %>% 
mutate(chosen=as.numeric(alternative == mapVector[as.character(Trial)]))

                 Ind Trial alternative price privacy battery stars chosen
1  R_2Xb32PAT3WjGBnc     1           1     2       3       1     1      1
2  R_2Xb32PAT3WjGBnc     1           2     3       1       2     2      0
3  R_2Xb32PAT3WjGBnc     1           3     1       2       3     3      0
4  R_2Xb32PAT3WjGBnc     2           1     1       2       2     1      0
5  R_2Xb32PAT3WjGBnc     2           2     2       3       3     2      1
6  R_2Xb32PAT3WjGBnc     2           3     3       1       1     3      0
7  R_2Xb32PAT3WjGBnc     3           1     3       1       3     1      0
8  R_2Xb32PAT3WjGBnc     3           2     1       2       1     2      1
9  R_2Xb32PAT3WjGBnc     3           3     2       3       2     3      0
10 R_2Xb32PAT3WjGBnc     4           1     1       1       1     2      0
11 R_2Xb32PAT3WjGBnc     4           2     2       2       2     3      1
12 R_2Xb32PAT3WjGBnc     4           3     3       3       3     1      0