在R数据帧索引中进行比较的是什么?

时间:2014-09-12 17:57:46

标签: r

我想了解以下代码实际上做了什么。我的目的是用df1的“Pop”列中的数据填充df2中的Pop列,按行“ID”匹配行。

df2$Pop <- df1[df1$ID == df2$ID,]$Pop

如果行没有排序(它可以只查找匹配ID的那个),这似乎是直接的,但是如果一个数据帧比另一个更大(有更多的行)怎么办? comarison的顺序是否重要?我不确定从前一行代码中可以得到什么。它是否像merge一样工作(如果在df1中我只有ID和Pop列)?如果是这样,为什么这两个版本(优点/缺点)?

df2 <- merge(df2, df1, by = "ID", all = FALSE, sort=FALSE)

通过测试具有不同行数的数据帧中的两个版本(df1具有100.000行,df2具有98.530),其中df1仅具有ID和Pop列但df2具有超过4000列,第一个版本立即给出了结果,merge版本需要大约8秒才能运行。我是R的新手,所以我甚至不知道如何测试输出并检查它们是否相同,但是它们应该是吗?

1 个答案:

答案 0 :(得分:0)

比较运算符,在这种情况下为==,返回逻辑向量(带有TRUEFALSE的向量作为条目) - 无论它是否在数据帧索引中。它接受两个对象,并访问(逐个位置)这些位置中的值是否相等。如果是,则返回TRUE在同一位置的新对象中,如果不是,则FALSE。随后,通过方括号df1将此逻辑向量传递给[],使df1成为子集,仅返回与逻辑向量为TRUE的位置关联的值。请注意df1$Pop是一个向量。 df1是一个数据框。

举例来说

V1 <- c(1,2,3)
V2 <- c(1,3,2)
V1==V2
## TRUE FALSE FALSE
V1[V2==V1]
## 1
V1[c(TRUE,FALSE,FALSE)]
## 1

就您的示例而言,您所做的只是对数据框进行子集化,仅返回ID相同的行,抓取$ Pop行并将其放入df2 $ Pop。

这与合并不同。合并需要两个data.frames,为了做任何有意义的事情,数据框应至少有两列。然后它查找一个数据框的行(使用by列)并将它们粘贴到另一个数据框的行旁边。在SQL中,它执行JOIN

例如:

df1<- data.frame(ID=1:3,V1=letters[1:3])
df1
##  ID V1
##1  1  a
##2  2  b
##3  3  c
df2<- data.frame(ID=c(1,3),V2=letters[3:4])
df2
##  ID V2
##1  1  c
##2  3  d
merge(df1,df2,by="ID")
##  ID V1 V2
##1  1  a  c
##2  3  c  d
df1[df1$ID==df2$ID,]$V1
##[1] a

通常,要测试两个表达式的结果,请获取表达式的结果并使用相等比较运算符:

V1 == V2
## TRUE FALSE FALSE

或使用all()获得单个结果。

all(V1==V2)
## FALSE

还有其他方法可以测试对象是否相同。 See this stackoverflow answer.