[英]Create new column based on values in 2 other columns
我是R的新手,我正在嘗試根據數據框中的其他2列創建新列。
UserID Age GradeLevel
001 10 5
002 10 3
003 8 4
004 10 7
005 8 3
006 8 NA
007 10 6
008 7 NA
009 7 6
我必須創建一個新的“Grade”列。 我需要先看看年齡,然后再看看GradeLevel。 如果指定的GradeLevel正確,則將相同的GradeLevel復制到新列。 如果指定的成績水平是錯誤的(如在障礙2,4,6,8,9中),那么我必須根據年齡將用戶分配到更高的等級。
例如,10歲的孩子可以是5年級或6年級,但如果GradeLevel不是5或6,則分配到6年級(2年級更高)。
所以期望的輸出應該是這樣的:
UserID Age GradeLevel Grade
001 10 5 5
002 10 3 6
003 8 4 4
004 10 7 6
005 8 3 3
006 8 NA 4
007 10 6 6
008 7 NA 3
009 7 6 3
GradeLevel是數據中的一個因素,但如果需要,我們可以將其轉換為字符。 在數據中,我有從K到12的所有GradeLevels。我正在嘗試使用ifelse語句,但無法使其工作。
test$Grade.f = ifelse(test$age==10 & (test$GradeLevel %in% c(5,6)), test$GradeLevel, "6")
ifelse(test$age==9 & (test$GradeLevel %in% c(4,5)), test$GradeLevel, "5").....
我需要一些幫助解決這個問題。
可能有幫助:
df1 <- data.frame(Age=10:7, Lowerlevel=5:2, Upperlevel=6:3)
library(dplyr)
res <- left_join(df,df1, by="Age")
df$Grade <- with(res, ifelse(is.na(GradeLevel)|GradeLevel< Lowerlevel|GradeLevel>Upperlevel,
Upperlevel, GradeLevel))
df
# UserID Age GradeLevel Grade
#1 1 10 5 5
#2 2 10 3 6
#3 3 8 4 4
#4 4 10 7 6
#5 5 8 3 3
#6 6 8 NA 4
#7 7 10 6 6
#8 8 7 NA 3
#9 9 7 6 3
df <- structure(list(UserID = 1:9, Age = c(10L, 10L, 8L, 10L, 8L, 8L,
10L, 7L, 7L), GradeLevel = c(5L, 3L, 4L, 7L, 3L, NA, 6L, NA,
6L)), .Names = c("UserID", "Age", "GradeLevel"), class = "data.frame", row.names = c(NA,
-9L))
另一個簡單方法:
# identify invalid values
invalid <- with(test, abs(Age - 4.5 - "[<-"(GradeLevel, is.na(GradeLevel), 0)) > 0.5)
# replace invalid values with default values
test$Grade <- ifelse(invalid, test$Age - 4, test$GradeLevel)
test
# UserID Age GradeLevel Grade
# 1 001 10 5 5
# 2 002 10 3 6
# 3 003 8 4 4
# 4 004 10 7 6
# 5 005 8 3 3
# 6 006 8 NA 4
# 7 007 10 6 6
# 8 008 7 NA 3
# 9 009 7 6 3
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.