我想了解以下代码实际上做了什么。我的目的是用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的新手,所以我甚至不知道如何测试输出并检查它们是否相同,但是它们应该是吗?
答案 0 :(得分:0)
比较运算符,在这种情况下为==
,返回逻辑向量(带有TRUE
和FALSE
的向量作为条目) - 无论它是否在数据帧索引中。它接受两个对象,并访问(逐个位置)这些位置中的值是否相等。如果是,则返回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.