根据 R 中的查找值将值分配给不同的列
Assign value to different columns based on lookup values in R
我正在尝试根据查找值将值分别分配给每一行的不同列。我在 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))
我对许多参与者(即行)进行了评估,并在许多项目(即列)中的每一个上都进行了评分。我想在我的数据框中为与项目分数相关的值创建变量(基于查找 table)。这是我想要的输出:
#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 的行。
这是一个 tidyverse 方法。它的基础是您想要首先 gather
分数列和 left_join
查找 table 以便您的值与分数相匹配。然后剩下的只是操纵回到所需的输出格式。为此,我们需要使用 gather
和 unite
创建我们想要的列名,然后最后 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-06-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))
我对许多参与者(即行)进行了评估,并在许多项目(即列)中的每一个上都进行了评分。我想在我的数据框中为与项目分数相关的值创建变量(基于查找 table)。这是我想要的输出:
#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 的行。
这是一个 tidyverse 方法。它的基础是您想要首先 gather
分数列和 left_join
查找 table 以便您的值与分数相匹配。然后剩下的只是操纵回到所需的输出格式。为此,我们需要使用 gather
和 unite
创建我们想要的列名,然后最后 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-06-19。