【问题标题】:Assign value to different columns based on lookup values in R [duplicate]根据R中的查找值将值分配给不同的列[重复]
【发布时间】:2018-06-19 19:21:19
【问题描述】:

我正在尝试根据查找值将值分配给不同的列,分别为每一行。我在 R 中工作。这是一个最小的工作示例:

#Item scores
item1 <- c(NA, 1, NA, 4)
item2 <- c(NA, 2, NA, 3)
item3 <- c(NA, 3, NA, NA)
item57 <- c(NA, 4, 4, 1)

mydata <- data.frame(item1, item2, item3, item57)

#Lookup values based on item score
lookup <- data.frame(score = 1:4, value=c(6, 7, 8, 10))

我有许多参与者(即行),对许多项目(即列)中的每一个都进行了评分评估。我想在我的数据框中为与项目分数相关的值创建变量(基于查找表)。这是我想要的输出:

#Desired output (adding value that is tied to item score to the original data)
desiredOutput <- cbind(mydata,
                   value1 = c(NA, 6, NA, 10),
                   value2 = c(NA, 7, NA, 8),
                   value3 = c(NA, 8, NA, NA),
                   value57 = c(NA, 10, 10, 6))

我有一个相当大的数据集,如果可能的话,我希望远离循环。此外,如果处理速度更快,我们可以跳过所有 NA 的行。

【问题讨论】:

  • 签出?dplyr::left_join

标签: r loops apply lookup lapply


【解决方案1】:

这是一个 tidyverse 方法。它的基础是您首先要gather 分数列和left_join 查找表,以便您的值与分数相匹配。然后剩下的只是操作以返回所需的输出格式。为此,我们需要使用gatherunite 创建我们想要的列名,然后最后将spread 退出。请注意,您需要在开头使用rowid_to_column,以便spread 知道在哪些行上放置哪些观察。如果您想准确获取输出列名称,可以混入一些 stringr

item1 <- c(NA, 1, NA, 4)
item2 <- c(NA, 2, NA, 3)
item3 <- c(NA, 3, NA, NA)
item57 <- c(NA, 4, 4, 1)

mydata <- data.frame(item1, item2, item3, item57)

#Lookup values based on item score
lookup <- data.frame(score = 1:4, value=c(6, 7, 8, 10))

library(tidyverse)
mydata %>%
  rowid_to_column(var = "participant") %>%
  gather(items, score, starts_with("item")) %>%
  left_join(lookup) %>%
  gather(coltype, val, score:value) %>%
  unite(colname, coltype, items) %>%
  spread(colname, val)
#> Joining, by = "score"
#>   participant score_item1 score_item2 score_item3 score_item57 value_item1
#> 1           1          NA          NA          NA           NA          NA
#> 2           2           1           2           3            4           6
#> 3           3          NA          NA          NA            4          NA
#> 4           4           4           3          NA            1          10
#>   value_item2 value_item3 value_item57
#> 1          NA          NA           NA
#> 2           7           8           10
#> 3          NA          NA           10
#> 4           8          NA            6

reprex package (v0.2.0) 于 2018 年 6 月 19 日创建。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-15
    • 1970-01-01
    • 2017-08-30
    • 2016-04-15
    • 2021-09-21
    • 2015-09-08
    相关资源
    最近更新 更多