R:连续搜索特定参数

时间:2017-11-19 11:36:06

标签: r datatable

我有2个数据表。一个人叫它df1只有2列

column1|column2
3      | 4 
3      | 6 
5      | 4 

然后我有一个df2,它可以有4个或更多列,甚至更多行

column1|column2|column3|column4
NA      | 3     |   NA  | NA
NA      | 5     |   6   | NA
3       | NA    |   4   | 1

我必须在df2中找到df1组合所代表的每个地方。在我做的例子中它将是1.因为唯一的组合是在column1和column3的3.行中。另外我只能使用data.table命令。这意味着我无法在任何地方使用。我尝试使用apply

rowcheck<-function(df1, df2){
    apply(df1, 1, function(x) any(apply(df2, 1, function(y) all(y==x))))
}

(do.call(paste0, df1) %in% do.call(paste0, df2))

还有更多,但我似乎无法得到它。任何建议或帮助将不胜感激

1 个答案:

答案 0 :(得分:0)

这对你有用吗?

library(dplyr)
library(data.table)
df1 <- data.table(`column 1` = c(3,3,5), `column 2` = c(4,6,4))
df2 <- data.table(`column 1` = c(NA,NA,3), `column 2` = c(3,5,NA),`column 3` = c(NA,6,4),`column 4` = c(NA,NA,1))

首先,我们希望找到df2中df1组合的所有位置。我们首先为df1的第一行解决这个问题。

我们首先为df1$column 1[1]的每列获取包含df2值的行。我们认为所有 NA 都不匹配。

 lapply(
   df2,
   function(column){
     !is.na(column) & 
      column == df1$`column 1`[1]}  ) 

这里我们使用的事实是data.tables实际上是列表,每列都是这个列表的一个元素。

我们现在有包含行的向量列表。我们需要将这些合并到一个单独的向量中,以便我们将结果与%>%一起输入到Reduce函数中并获取所有向量的逻辑 |

 lapply(
   df2,
   function(column){
     !is.na(column) & 
     column == df1$`column 1`[idx]
   }) %>% Reduce(`|`,., init = FALSE)

我们现在有一个向量,其中df2的所有行都包含任意列中df1$column 1[1]的值。我们对df1$column 2[1]执行相同操作并采用逻辑 &

lapply(
  df2,
  function(column){
    !is.na(column) & 
    column == df1$`column 1`[1]} 
) %>% 
  Reduce(|,., init = FALSE) & 
lapply(
  df2,
  function(column){
    !is.na(column) & 
     column == df1$`column 2[1]`} 
) %>% 
  Reduce(|,., init = FALSE))

现在回答我们的第一个问题,我们只需询问df2中的任何行是否包含df1的值,并将其转移到{的所有行{1}}调用sapply

df1

要回答secoind问题(在下面的评论中发布) sapply(1:nrow(df1),function(idx){any(lapply(df2,function(column){!is.na(column) & column == df1$`column 1`[idx]} ) %>% Reduce(`|`,., init = FALSE) & lapply(df2,function(column){!is.na(column) & column == df1$`column 2`[idx]} ) %>% Reduce(`|`,., init = FALSE))}) 中每行包含多少次,我们只需要使用df2anny更改为summutate包中的filter我们可以得到一个很好的表,其中包含dplyrdf1的所有行及其计数

df2