r 条件查找和派生变量创建

问题描述 投票:0回答:1

我的目标是创建一个派生变量列

FinalScore

目前这是我的数据集。

#Number of rows in the dataset 
n <- 100

#Generate random IDs 
ids <- 1:n

#Generate random genders (male or female) 
genders <- sample(c("male", "female"), n, replace = TRUE)

#Generate random groups (preschool or middle school) 
groups <- sample(c("Bears", "CyHawks"), n, replace = TRUE)

#Generate random integers from 0 to 115 
RawScore <- sample(0:115, n, replace = TRUE)

#Create a data frame with the generated data 
df <- data.frame(ID = ids, Gender = genders, Group = groups, RawScore = RawScore )

#Create a column RawScore_new 
tempdf <- data.table(cbind(   RawScore = c(0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48), RawScore_new = c(5.7,11.4,15.8,19.9,23.9,27.9,31.9,35.8,39.7,43.5,47.3,51,54.6,58,61.4,64.6,67.8,70.7,73.6,76.4,79.1,81.8,84.4,87.1,89.8,92.6,95.5,98.5,101.7,105.1,108.6,112.2,116,119.8,123.8,127.8,131.8,135.9,140,144.1,148.1,152.2,156.3,160.3,164.4,168.4,172.5,176.6,181.5)))
df <- df  
df <- merge(df, 
            tempdf ,
            by = "RawScore",
            all.x = TRUE) 
df$RawScore_new <- round(df$RawScore_new , 0)

我的目标是创建一个专栏

FinalScore
这样

如果

group = "Bears"
,则使用此查找表通过将
FinalScore
列中的值与
df$RawScore_new
 列中的值进行匹配来创建 
Bears_Lookup$RawScore_new

Bears_Lookup <- data.table(cbind(
RawScore_new = c(0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17, 18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35
,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,
 70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,
102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125
,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,
150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,
174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195),

FinalScore = c(34,34,35,35,35,36,36,37,37,37,38,38,39,39,39,40,40,40,41,41,42,42,42,43,43
,,44,44,44,45,45,45,46,46,47,47,47,48,48,49,49,49,50,50,51,51,51,52,52,52,53
,53,54,54,54,55,55,56,56,56,57,57,57,58,58,59,59,59,60,60,60,61,61,62,62,62
,,63,63,64,64,64,65,65,66,66,66,67,67,67,68,68,69,69,69,70,70,71,71,71,72,72
,72,73,73,74,74,74,75,75,76,76,76,77,77,77,78,78,79,79,79,80,80,81,81,81,82
,82,82,83,83,84,84,84,85,85,86,86,86,87,87,97,88,88,89,89,89,90,90,91,91,91
,92,92,92,93,93,94,94,94,95,95,96,96,96,97,97,97,98,98,99,99,99,100,100,101,101
,101,102,102,102,103,103,104,104,104,105,105,106,106,106,107,107,107,108,108,109,109)
))

如果

group = "CyHawks" and Gender ="Male"
,则使用此查找表通过将
FinalScore
列中的值与
df$RawScore_new
 列中的值进行匹配来创建 
CyHawks_Lookup_Male$RawScore_new

CyHawks_Lookup_Male <- data.table(cbind(
RawScore_new = c(0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17, 18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35
,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,
 70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,
102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125
,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,
150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,
174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195),

FinalScore = c(37,37,37,38,38,39,39,39,40,40,41,41,41,42,42,43,43,43,44,44,45,45,45,46,46
,47,47,47,48,48,49,49,49,50,50,51,51,51,52,52,53,53,53,54,54,55,55,55,56,56
,57,57,57,58,58,58,59,59,60,60,60,61,61,62,62,62,63,63,64,64,64,65,65,66,66
,66,67,67,68,68,68,69,69,70,70,70,71,71,72,72,72,73,73,74,74,74,75,75,76,76
,76,77,77,78,78,78,79,79,80,80,80,81,81,82,82,82,83,83,83,84,84,85,85,85,86
,86,87,87,87,88,88,89,89,89,90,90,91,91,91,92,92,93,93,93,94,94,95,95,95,96
,96,97,97,97,98,98,99,99,99,100,100,101,101,101,102,102,103,103,103,104,104,105,105,105,106
106,107,107,107,108,108,108,109,109,110,110,110,111,111,112,112,112,113,113,114,114)
))

如果

group = "CyHawks" and Gender ="Female"
,则使用此查找表通过将
FinalScore
列中的值与
df$RawScore_new
 列中的值进行匹配来创建 
CyHawks_Lookup_Female $RawScore_new

CyHawks_Lookup_Female <- data.table(cbind(
RawScore_new = c(0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17, 18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35
,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,
 70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,
102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125
,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,
150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,
174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195),

FinalScore = c(38,38,39,39,39,40,40,41,41,42,42,42,43,43,44,44,45,45,45,46,46,47,47,47,48
,48,49,49,50,50,50,51,51,52,52,53,53,53,54,54,55,55,55,56,56,57,57,58,58,58
,59,59,60,60,61,61,61,62,62,63,63,64,64,64,65,65,66,66,66,67,67,68,68,69,69
69,70,70,71,71,72,72,72,73,73,74,74,74,75,75,76,76,77,77,77,78,78,79,79,80
80,80,81,81,82,82,82,83,83,84,84,85,85,85,86,86,87,87,88,88,88,89,89,90,90
91,91,91,92,92,93,93,93,94,94,95,95,96,96,96,97,97,98,98,99,99,99,100,100,101
101,101,102,102,103,103,104,104,104,105,105,106,106,107,107,107,108,108,109,109,109,110,110,111,111
112,112,112,113,113,114,114,115,115,115,116,116,117,117,118,118,118,119,119,120,120)
))

我已经涉足

new <- df %>%
 mutate(
  FinalScore = case_when(
 group == "Bears" ~ Bears_Lookup$FinalScore[match(unlist(new$RawScore_new), Bears_Lookup$RawScore_new)],
 group = "CyHawks" & Gender ="Male" ~ CyHawks_Lookup_Male$FinalScore[match(unlist(new$RawScore_new), CyHawks_Lookup_Male$RawScore_new)],
 group = "CyHawks" & Gender ="Female" ~ CyHawks_Lookup_Female$FinalScore[match(unlist(new$RawScore_new), CyHawks_Lookup_Female$RawScore_new)]
 
)

我遇到错误,不知道如何继续。因此,任何有关如何通过根据

FinalScore
和性别
RawScore_new
匹配查找表中
Bears_Lookup , CyHawks_Lookup_Male,CyHawks_Lookup_Female
列中的值来创建派生变量
Group: Bears or Cyhawks
的建议都将受到高度赞赏。预先感谢。
    

r dplyr match lookup
1个回答
0
投票

Male or Female

使用 
    # Prepare Lookup tables for joining. library(tidyverse) Bears_Lookup <- Bears_Lookup |> mutate(Group = "Bears") CyHawks_Lookup <- bind_rows( CyHawks_Lookup_Male |> mutate(Group = "CyHawks", Gender = "Male"), CyHawks_Lookup_Female |> mutate(Group = "CyHawks", Gender = "Female") )
  1. 添加查找表中的 FinalScore 列。
  2. left_join()
  3. FinalScore
    清理
    mutate()
    
    
  4. coalesce()
© www.soinside.com 2019 - 2024. All rights reserved.