【问题标题】:How to extract specific value from a vector?如何从向量中提取特定值?
【发布时间】:2019-12-08 21:19:54
【问题描述】:

有一个向量和一个数据框。向量是记录受访者对调查的反应的原始数据(他们必须从三个中选择一个),因此它表示从 1 到 3。数据框是组织第一个 d.f. 的结果。我需要的是从每个 Trial 的向量中拖动结果,并在 d.f 中用新列“选择”表示。

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

这两个数据集是这样的

Vector
conjoint_full_info.1. conjoint_full_info.2. conjoint_full_info.3. conjoint_full_info.4.
1                     2                     2                     2                     

d.f
                 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   
7  R_2Xb32PAT3WjGBnc     3           1     3       1       3     1   
8  R_2Xb32PAT3WjGBnc     3           2     1       2       1     2   
9  R_2Xb32PAT3WjGBnc     3           3     2       3       2     3   
10 R_2Xb32PAT3WjGBnc     4           1     1       1       1     2   
11 R_2Xb32PAT3WjGBnc     4           2     2       2       2     3   
12 R_2Xb32PAT3WjGBnc     4           3     3       3       3     1              

and this is what I want

d.f
                 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   1
11 R_2Xb32PAT3WjGBnc     4           2     2       2       2     3   0
12 R_2Xb32PAT3WjGBnc     4           3     3       3       3     1   0

【问题讨论】:

  • 不明白vector和table的关系。
  • @SimonWoodward 数字紧跟在每个向量列名称之后,conjoint_full_info 应该与 d.f$Trial 匹配。一旦我找到相应的数字(在这种情况下,试验 1 的受访者选择了 1,我可以从向量中看到这一点,在试验 1 部分的第一行中显示“1”。就像我在上面的表格中指出的那样)跨度>
  • 所以每个向量都针对特定的 Ind,您想知道他们选择了哪个替代方案?建议您将向量绑定到包含 Ind、Trial 和选择的列的数据框中。然后你可以使用连接函数和变异。

标签: r


【解决方案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

【讨论】:

  • 我猜他有一堆这样的向量,他打算循环遍历个人。
猜你喜欢
  • 2020-07-17
  • 1970-01-01
  • 1970-01-01
  • 2015-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-22
  • 2016-03-12
相关资源
最近更新 更多