我有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))
还有更多,但我似乎无法得到它。任何建议或帮助将不胜感激
答案 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))})
中每行包含多少次,我们只需要使用df2
将anny
更改为sum
和mutate
包中的filter
我们可以得到一个很好的表,其中包含dplyr
中df1
的所有行及其计数
df2