R中的类型和比较

时间:2014-06-30 12:34:04

标签: r types dataframe type-conversion

我和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的说法)。因此,只是在某个表达式中用另一个成员B替换成员A,该成员应该等于A(给定“TRUE”语句)应该对该表达式的结果没有影响。
  • 3 TRUE != [1] TRUE。我认为[1] TRUE是大小为1的逻辑向量,第一个元素为TRUE。 3 TRUE是(1x1)矩阵行,其中“email”值为TRUE。

我的问题是一致性:相同内容但不同类型的两个对象应该相等,或者它们应该是不同的。我有一个问题“有时有类型推断,有时没有”。除了这种行为之外我还有什么规则吗? (我猜有一个)

我想要获得的另一种表达方式是:

> unique(users$email) == "matt@damon.com"
[1] FALSE FALSE  TRUE FALSE
> unique(users$email) == user["email"]
  email
3 FALSE

显然R确实得到了我想要的东西(考虑到它给了我匹配的行)。但我不能解释(也不使用)第二个陈述的结果。 任何解释/想法?

1 个答案:

答案 0 :(得分:0)

在正常列表情况下

users$email == user[["email"]]
然而,在data.frames中,事情变得不一致/更糟糕!

tdf=data.frame(matrix(1:100,10,10))
tdf[] # returns data.frame everything
tdf[1] # returns data.frame first column
tdf[1,1] # returns object as type of the object...
tdf[,1] # returns a vector of the first column
tdf[1,] # returns a data.frame of the first row # eeeeeugh... that is odd....
tdf[2:4] # returns a data.frame with 3 columns
tdf[1,2:4] # returns a data.frame of the first row of 3 colums
tdf[2:4,2:4] # returns a 3x3 data.frame
tdf[2:4,1] # returns a vector of 2:4 row and 1st column
tdf[,2:4] # returns a data.frame with 3 columns

然后还有双[[]]

请注意,在data.frames中,事情变得非常恼人和烦人

tdf[[1]] # gives the first row as a vector
tdf[[1,1]] # gives first element

几乎所有其他组合都会产生错误

并将内容分配给data.frame或matrix,这是一个更大的混乱!