簡體   English   中英

根據其他2列中的值創建新列

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM