【发布时间】:2014-08-20 20:01:01
【问题描述】:
我已经使用 R 一个月左右了,我对一些细微之处的理解仍然很肤浅。 我遇到了一个问题,我设法解决了(详情如下),但我仍然无法准确解释为什么它不适用于第一个解决方案。 请注意,下面的示例没有实际意义,因为我已将其尽可能简化,以便问题很清楚。
问题: 给定一个包含 4 列(电子邮件、第一、最后、公司)的数据框:
> users <- data.frame(matrix(vector(), 0, 4, dimnames=list(c(), c("email", "first", "last", "company"))), stringsAsFactors=F)
> users[1,] <- c("robert@redford.com", "Robert", "Redford", "Paramount")
> users[2,] <- c("julia@roberts.com", "Erin", "B.", "Hinkley")
> users[3,] <- c("matt@damon.com", "Will", "H.", "Stanford")
> users[4,] <- c("john@malkovitch.com", "John", "M.", "JM")
我选择一个特定的行:
> user <- users[3,]
当我尝试根据可能导致返回前面提到的行的条件对数据框进行子集化时,它不返回任何结果。
> users[users$email == user["email"],]
[1] email first last company
<0 lignes> (ou 'row.names' de longueur nulle)
我立刻认为这是一个选角问题(对不起这个糟糕的问题)
> users[users$email == as.character(user["email"]),]
email first last company
3 matt@damon.com Will H. Stanford
但是,当我试图找出问题的确切位置并尝试以下操作时:
> users[users$email == "matt@damon.com",]
email first last company
3 matt@damon.com Will H. Stanford
> user["email"] == "matt@damon.com"
email
3 TRUE
> users[3,]$email == user$email
[1] TRUE
我很困惑:
- 首先,我认为它是一道数学题:
if A == B and B == C, then A == C(根据船长 Obvious 的说法)。因此,仅将成员 A 替换为在某些表达式中应该等于 A(给定“TRUE”语句)的另一个成员 B 应该不会影响此表达式的结果。 -
3 TRUE != [1] TRUE。我认为[1] TRUE是大小为 1 的逻辑向量,其中第一个元素为 TRUE。3 TRUE是 (1x1) 矩阵行,其中“电子邮件”列的值为 TRUE。
我的问题在于一致性:内容相同但类型不同的两个对象应该相等,或者它们应该不同。我对“有时有类型推断,有时没有”有疑问。除了这种行为,有没有我看不到的规则? (我猜有一个)
我想得到的行为的另一种表达方式是:
> unique(users$email) == "matt@damon.com"
[1] FALSE FALSE TRUE FALSE
> unique(users$email) == user["email"]
email
3 FALSE
显然 R 确实得到了我想要的(考虑到它给了我匹配行的事实)。但我无法解释(也无法使用)第二条语句的结果。 有什么解释/想法吗?
【问题讨论】:
-
试试
user[["email"]]
标签: r types dataframe type-conversion