R中有用的一个非常出乎意料的行为data.frame
源于将character
列作为因素。如果不考虑,这会导致很多问题。例如假设以下代码:
foo=data.frame(name=c("c","a"),value=1:2)
# name val
# 1 c 1
# 2 a 2
bar=matrix(1:6,nrow=3)
rownames(bar)=c("a","b","c")
# [,1] [,2]
# a 1 4
# b 2 5
# c 3 6
那么你对跑步有什么期望bar[foo$name,]
呢?它通常应该返回根据'c' 和 'a' 行bar
命名的行。foo$name
但结果不同:
bar[foo$name,]
# [,1] [,2]
# b 2 5
# a 1 4
原因就在这里:foo$name
不是字符向量,而是整数向量。
foo$name
# [1] c a
# Levels: a c
为了获得预期的行为,我手动将其转换为字符向量:
foo$name = as.character(foo$name)
bar[foo$name,]
# [,1] [,2]
# c 3 6
# a 1 4
但问题是我们很容易错过执行此操作,并在我们的代码中隐藏错误。有没有更好的解决方案?