【问题标题】:Types and comparisons in RR中的类型和比较
【发布时间】: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


【解决方案1】:

在正常列表情况下

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 或矩阵,是一个更大的混乱!

【讨论】:

  • 因为你的贬义语言,我投了反对票。虽然使用 [[[ 运算符一开始可能会令人困惑,但称其为“混乱”或“丑陋”是不恰当且无益的。
  • 刚刚回到这个问题,有了更多的 R 经验。看来您的回答很好,并且解决了我起初没有看到的问题,尽管我在“混乱”部分上并不真正同意您的观点!抱歉延迟了 18 个月 ;-)
猜你喜欢
  • 2018-01-21
  • 2011-09-03
  • 1970-01-01
  • 2023-03-26
  • 2021-03-03
  • 1970-01-01
  • 1970-01-01
  • 2011-11-30
  • 2016-09-03
相关资源
最近更新 更多