我有两个数据框,两个数据框共享一个公共ID变量。然而,一个有超过1000个观察,而另一个有大约100.下面是它们的样子的一个例子。
df1 = data.frame(Id = c(1,1,1,2,2,2,3,3,3), Type1 =
c(1,NA,NA,2,NA,NA,4,NA,NA), Type2= c(1,NA,NA,2,NA,NA,4,NA,NA))
#df1
# Id Type1 Type2
# 1 1 1
# 1 NA NA
# 1 NA NA
# 2 2 2
# 2 NA NA
# 2 NA NA
# 3 4 4
# 3 NA NA
# 3 NA NA
df2 = data.frame(Id = c(1,2,3), Othertypes = c(5,4,6))
#df2
# Id Othertypes
# 1 5
# 2 4
# 3 6
合并时,重复较短数据框(df2)中df12$Othertypes
的情况,如下:
df12 <- merge(df1,df2, by ="Id")
#df12
# Id Type1 Type2 Othertypes
# 1 1 1 5
# 1 NA NA 5
# 1 NA NA 5
# 2 2 2 4
# 2 NA NA 4
# 2 NA NA 4
# 3 4 4 6
# 3 NA NA 6
# 3 NA NA 6
然而,我真正想要的是1&#34; Othertypes&#34;每个Id的案例,如此:
#df12
# Id Type1 Type2 Othertypes
# 1 1 1 5
# 1 NA NA NA
# 1 NA NA NA
# 2 2 2 4
# 2 NA NA NA
# 2 NA NA NA
# 3 4 4 6
# 3 NA NA NA
# 3 NA NA NA
我尝试了以下替代方案:
temp <- merge(df1,df2, by="Id",sort=FALSE)
temp2 <- left_join(df1, df2, by = "Id")
除了使用data.table
(非常失败)以及使用plyr
的功能(也不成功)之外。
答案 0 :(得分:1)
以下是一种使用match
,*
,[
和一点NA魔法的方法。
df1$others <- df2$Othertypes[match(df1$Id, df2$Id)] * NA^is.na(df1$Type1)
match
返回与第二个参数匹配的第一个参数的位置。使用[
df $会根据match
的位置输出重复Othertypes,因此df2$Othertypes[match(df1$Id, df2$Id)]
将返回您使用merge
获得的向量。现在,此向量乘以NA^is.na(df1$Type1)
,当df1$Type1
为NA时返回NA,而当df1
Id Type1 Type2 others
1 1 1 1 5
2 1 NA NA NA
3 1 NA NA NA
4 2 2 2 4
5 2 NA NA NA
6 2 NA NA NA
7 3 4 4 6
8 3 NA NA NA
9 3 NA NA NA
为NA时返回1。
返回
self.ref = FIRDatabase.database().reference()
ref.child("users").child("userID").observeSingleEventOfType(.Value, withBlock: { (snapshot) in
if snapshot.hasChild("phoneNumber"){
print("Phone number exist")
}else{
print("Phone number doesn't exist")
}
})
答案 1 :(得分:0)
您可以使用df1 = data.frame(Id = c(1,1,1,2,2,2,3,3,3), Type1 =
c(1,NA,NA,2,NA,NA,4,NA,NA), Type2= c(1,NA,NA,2,NA,NA,4,NA,NA))
df2 = data.frame(Id = c(1,2,3), Othertypes = c(5,4,6))
df1$Othertypes<-NA
df2$Type1<-NA
df2$Type2<-NA
rbind(df1,df2)
Id Type1 Type2 Othertypes
1 1 1 1 NA
2 1 NA NA NA
3 1 NA NA NA
4 2 2 2 NA
5 2 NA NA NA
6 2 NA NA NA
7 3 4 4 NA
8 3 NA NA NA
9 3 NA NA NA
10 1 NA NA 5
11 2 NA NA 4
12 3 NA NA 6
:
Scalar ScalarHSV2BGR(uchar H, uchar S, uchar V) {
Mat rgb;
Mat hsv(1,1, CV_8UC3, Scalar(H,S,V));
cvtColor(hsv, rgb, CV_HSV2BGR);
return Scalar(rgb.data[0], rgb.data[1], rgb.data[2]);
}
答案 2 :(得分:0)
试试这个
df1 = data.frame(Id = c(1,1,1,2,2,2,3,3,3),
Type1 = c(1,NA,NA,2,NA,NA,4,NA,NA),
Type2 = c(1,NA,NA,2,NA,NA,4,NA,NA))
df2 = data.frame(Id = c(1,2,3), Othertypes = c(5,4,6))
df12 = merge(df1,df2, by="Id")
df12$Othertypes = ifelse(!duplicated(df12$Othertypes), df12$Othertypes, NA)
答案 3 :(得分:0)
我认为解决方法是插入&#34; Type1&#34; df2中的列也会然后按两列合并,如下所示:
a<-df1$Type1
a<-a[is.na(a)]
df2$Type1<-a
df12 <- merge(df1,df2, by =c("Id","Type1"),all.x=T)
df12
# Id Type1 Type2 Othertypes
#1 1 1 1 5
#2 1 NA NA NA
#3 1 NA NA NA
#4 2 2 2 4
#5 2 NA NA NA
#6 2 NA NA NA
#7 3 4 4 6
#8 3 NA NA NA
#9 3 NA NA NA