为什么 R 的 sapply 和 switch 函数像函数一样处理字符值?

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

我正在尝试使用 sapply 和 switch 将描述性名称应用于数据。我已经多次使用这种方法,没有出现任何问题,但对于我最近的项目中的(只有一个!)专栏,它抛出了错误。我最好的猜测是,即使该值保存为字符串,该值也将是 R 中的保留字。我在下面创建了一个可重现的示例。

我的项目中的实际值与性别无关,并且可能有很多可能的选择。有人可以告诉我如何使用 sapply/switch 来避免代码中出现许多嵌套的 ifelse 语句吗?

# create test data
testdta <- as.data.frame(cbind(userid = c("1", "2", "3", "4"), gender = c("F", "M", "F", "M")))

# sapply/switch works with strings that are not reserved words
testdta$uiddescription <- sapply(testdta$userid, switch, "1" = "1 - first", "2" = "2 - second", "3+ - third or beyond")
testdta

# sapply/switch won't work when trying to interpret gender (possibly because F is reserved?)
testdta$gdescription <- sapply(testdta$gender, switch, "F" = "F - female", "M" = "M - male")

我收到的错误是“get(as.character(FUN), mode = "function", envir = envir) 中的错误: 未找到模式“功能”的对象“F - 女性”。”

r switch-statement sapply
2个回答
1
投票

发生这种情况是因为

sapply
中的部分参数匹配。它将
"F" = 
读取为
FUN
中的
sapply
参数。如果您明确并执行
FUN = switch
,它就会起作用。


0
投票

假设你总是有

"F"
(所以
sapply(.., switch, ..)
技巧不起作用),这里还有另外两个选择:

字典查找

vec <- c("F" = "F - female", "M" = "M - male")
vec[testdta$gender]
#            F            M            F            M 
# "F - female"   "M - male" "F - female"   "M - male" 

合并/加入

genders <- data.frame(gender=c("F", "M"), gender2=c("F - female", "M - male"))
merge(testdta, genders, by="gender", all.x=TRUE)
#   gender userid    gender2
# 1      F      1 F - female
# 2      F      3 F - female
# 3      M      2   M - male
# 4      M      4   M - male

合并/连接的概念很棒,但如果您不熟悉,可能会变得很复杂,请参阅如何连接(合并)数据框(内部,外部,左,右)INNER JOIN,LEFT JOIN有什么区别, RIGHT JOIN 和 FULL JOIN?, (data.table) 使用 data.table 进行左连接.

© www.soinside.com 2019 - 2024. All rights reserved.