2016-11-25 64 views
0

我有3个数据帧。一个包含整套数字。第二和第三个数据帧包含具有某种特征(类型1或类型2)的这些数字的子集。我想要做的是将这些数据帧合并为一个,以便每个数字都被检查为类型1或类型2。与其他数据帧的值匹配的标签值

例子:

numbers <- c("+333","+334", "+335", "+443", "+444", "+445", "+553", "+554", "+555") 
typeone <- c("+333","+334", "+335", "+443") 
typetwo <- c("+335", "+443", "+444", "+445") 
fs <- data.frame(numbers)   
to<- data.frame(typeone) 
tt<- data.frame(typetwo) 
合并 fstott

期望的结果:

numbers typeone typetwo 
1 333   yes 
2 334   yes 
3 335   yes  yes 
4 443   yes  yes 
5 444     yes 
6 445     yes 
7 553  
8 554  
9 555  

回答

2

试试这个:

data.frame(numbers = numbers, 
       typeone = numbers %in% typeone, 
       typetwo = numbers %in% typetwo) 

然后你就可以更换新的逻辑列,但是你想。

+0

也许这:'data.frame(数字=数字, typeone = ifelse(数字%in type typeone,“yes”,“”), typetwo = ifelse(numbers%in%typetwo,“yes”,“”))' –

+1

是的,这是最简单的解决方案,但我没有看到使用逻辑上的二进制字符串。所以我把它交给了OP。 –

+0

@AndreyKolyadin你是对的,如果你按照某人的建议去遍历“是”,“”路线,那么用户可以更容易地将子集(需要)或稍后编入索引,而无需再次将其转换为逻辑。另外,使用'ifelse'也可能会减慢进程的不必要程度 – akrun

2

您可以尝试顺序合并。要获得开箱即用的漂亮列名称,您可以将名称更改为names(to) <- c("numbers", "typeone"),并将tt更改为类似名称。

to$mhm <- "yes" 
tt$mhm <- "yes" 

out <- merge(fs, to, by.x = "numbers", by.y = "typeone", all.x = TRUE) 
merge(out, tt, by.x = "numbers", by.y = "typetwo", all.x = TRUE) 

    numbers mhm.x mhm.y 
1 +333 yes <NA> 
2 +334 yes <NA> 
3 +335 yes yes 
4 +443 yes yes 
5 +444 <NA> yes 
6 +445 <NA> yes 
7 +553 <NA> <NA> 
8 +554 <NA> <NA> 
9 +555 <NA> <NA> 

,或将数据集在list,设置相同的列名,并使用Reducemerge

Reduce(function(...) merge(..., by= "numbers", all.x=TRUE), 
     list(fs, setNames(to, "numbers"), setNames(tt, "numbers"))) 
+0

@akrun可以通过编辑来改善我的问题。 –

相关问题