首页 > 解决方案 > 将一列中的值应用于新列

问题描述

我有一个数据框,其中有几列,每列对应于不同刺激的评级。我也有列指示每个参与者看到每个项目的顺序。每行是一个参与者。

x <- data.frame("post1" = c(1, NA, 2, 3, NA), #stimuli ratings columns
                "post2" = c(3, 1, NA, NA, 4),
                "post3" = c(NA, 3, 1, 4, NA),
                "firstpost" = c("post3", "post1", "post3", "post6", 
                 "post4"), #stimuli order columns
                "secondpost" = c("post2", "post3", "post1", "post4", 
                 "post1"))

我想按照他们看到刺激的顺序制作另一组列,其中包含来自第一组列(“post1”等)的值(评级) - 例如,如果他们首先看到帖子 3,则新列会有他们对帖子 3 的评价。像这样:

firstpostrating <- c(4, 1, 2, 3, 2)
secondpostrating <- c(1, 3, 3, 2, 1)

我需要一种方法从他们看到的每个刺激的相应刺激列中获取值。我希望的结果是第一、第二、第三刺激的列和相应的评级——所以我可以看看顺序效应。

任何为此编写函数的帮助将不胜感激!

标签: rdata-structures

解决方案


在这里,我提供一种解决方案。我使用的示例数据x与您的略有不同。因为为了保持一致性,示例数据不应包含post6and post4

library(data.table)
x <- data.table(post1 = c(1, NA, 2, 3, 4), #stimuli ratings columns
                post2 = c(3, 1, NA, 2, 5),
                post3 = c(2, 3, 1, 4, 5),
                firstpost = c("post3", "post1", "post3", "post2", 
                 "post1"), #stimuli order columns
                secondpost = c("post2", "post3", "post2", "post3", 
                 "post1"))
x
#>    post1 post2 post3 firstpost secondpost
#> 1:     1     3     2     post3      post2
#> 2:    NA     1     3     post1      post3
#> 3:     2    NA     1     post3      post2
#> 4:     3     2     4     post2      post3
#> 5:     4     5     5     post1      post1
x[,`:=`(firstpostrate  = get(firstpost),
        secondpostrate = get(secondpost)),
  by = post1]
x
#>    post1 post2 post3 firstpost secondpost firstpostrate secondpostrate
#> 1:     1     3     2     post3      post2             2              3
#> 2:    NA     1     3     post1      post3            NA              3
#> 3:     2    NA     1     post3      post2             1             NA
#> 4:     3     2     4     post2      post3             2              4
#> 5:     4     5     5     post1      post1             4              4

reprex 包于 2021-04-29 创建 (v2.0.0 )


推荐阅读