我有2个数据框
lookup_table <- data.frame(Country = c("UK","France", "Germany"), A = c(0,0,1), B = c(1,6,7), C = c(4,8,9))
set.seed(123) # for being reproducible
df <- data.frame(Country = c("UK","UK","France","France","Germany","Germany","Germany","France","UK"), Values = runif(9, 1, 10))
我想在 df 中有第三列,它根据第 2 列中的值和国家/地区分配类别。
类似于下面的内容,但值不应该是固定的:它们应该取决于查找表中的值和国家/地区
Class <- function(x) {
if(x > 0 & x <= 1) y <- "A"
if(x > 1 & x <= 4) y <- "B"
if(x > 4) y <- "C"
return(y)
}
df$Class <- sapply(df$Values,Class)
预先感谢您的帮助
最佳答案
这是 dplyr
解决方案。
library(dplyr)
df %>%
inner_join(lookup_table, by = "Country") %>%
mutate(Class = ifelse(Values > A & Values < B, "A",
ifelse(Values > B & Values < C, "B",
ifelse(Values > C, "C", "Not_found"))))
在管道末尾添加 select(-c(A,B,C))
以获得更清晰的输出 data.frame
。作为此方法的另一个好处,任何不在范围内的值都将被标记为“Not_found”
。
关于r - 寻求一种更干净的方法来避免嵌套 if 语句(使用 sapply),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38433873/